在 Pygame 賽車遊戲開發中,實作車輛的移動和邊界控制是至關重要的。本文將逐步講解如何使用鍵盤控制主車的移動,並設定邊界限制,確保車輛在遊戲視窗內活動。此外,我們還會介紹如何使用 random 模組隨機生成敵方車輛的位置,提升遊戲的趣味性和挑戰性。透過這些技術,可以構建一個更具互動性和可玩性的賽車遊戲。後續還可以加入碰撞檢測、計分系統等功能,使遊戲更加完整。
遊戲開發:實作車輛移動控制
在前面的章節中,我們成功地在遊戲視窗中顯示了多輛車。然而,這些車輛只是靜態的圖片,無法進行任何互動。在本章節中,我們將學習如何透過鍵盤控制主車的移動。
理解座標系統
在Pygame中,遊戲視窗的座標系統是根據畫素的。視窗的左上角被定義為(0, 0),而X軸和Y軸分別向右和向下延伸。因此,要移動主車,我們需要改變其X和Y座標。
實作車輛移動
首先,我們需要初始化一些變數來控制主車的位置和移動。
maincarX = 350
maincarY = 495
maincarX_change = 0
maincarY_change = 0
接下來,我們需要在事件迴圈中監聽KEYDOWN事件,以檢測使用者是否按下了方向鍵。如果按下了方向鍵,我們需要更新maincarX_change和maincarY_change的值,以控制主車的移動方向和速度。
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
maincarX_change += 5
if event.key == pygame.K_LEFT:
maincarX_change -= 5
if event.key == pygame.K_UP:
maincarY_change -= 5
if event.key == pygame.K_DOWN:
maincarY_change += 5
然後,我們需要在主迴圈中更新主車的位置。
maincarX += maincarX_change
maincarY += maincarY_change
內容解密:
maincarX_change和maincarY_change變數用於控制主車在X軸和Y軸上的移動速度。- 當按下方向鍵時,
maincarX_change和maincarY_change的值會被更新,從而改變主車的移動方向和速度。 - 在主迴圈中,
maincarX和maincarY的值會根據maincarX_change和maincarY_change的值進行更新,從而實作主車的移動。
解決車輛持續移動的問題
然而,目前的程式碼存在一個問題:當按下方向鍵後,即使釋放了鍵盤,主車仍然會持續移動。這是因為我們只處理了KEYDOWN事件,而沒有處理KEYUP事件。
為瞭解決這個問題,我們需要在事件迴圈中監聽KEYUP事件,以檢測使用者是否釋放了方向鍵。如果釋放了方向鍵,我們需要重置maincarX_change和maincarY_change的值,以停止主車的移動。
if event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT:
maincarX_change = 0
if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
maincarY_change = 0
內容解密:
- 當釋放方向鍵時,
maincarX_change和maincarY_change的值會被重置為0,從而停止主車的移動。 - 這樣,主車只有在按下方向鍵時才會移動,釋放鍵盤後會停止移動。
結合所有程式碼
以下是完整的程式碼:
import pygame
pygame.init()
# 設定遊戲視窗
screen = pygame.display.set_mode((798, 600))
# 定義遊戲迴圈函式
def gameloop():
# 設定背景圖片
bg = pygame.image.load('car game/bg.png')
# 設定主車圖片
maincar = pygame.image.load('car game/car.png')
maincarX = 350
maincarY = 495
maincarX_change = 0
maincarY_change = 0
# 其他車輛圖片
car1 = pygame.image.load('car game/car1.jpeg')
car2 = pygame.image.load('car game/car2.png')
car3 = pygame.image.load('car game/car3.png')
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
# 處理KEYDOWN事件
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
maincarX_change += 5
if event.key == pygame.K_LEFT:
maincarX_change -= 5
if event.key == pygame.K_UP:
maincarY_change -= 5
if event.key == pygame.K_DOWN:
maincarY_change += 5
# 處理KEYUP事件
if event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT or event.key == pygame.K_LEFT:
maincarX_change = 0
if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
maincarY_change = 0
# 更新主車位置
maincarX += maincarX_change
maincarY += maincarY_change
# 繪製遊戲畫面
screen.fill((0, 0, 0))
screen.blit(bg, (0, 0))
screen.blit(maincar, (maincarX, maincarY))
screen.blit(car1, (200, 100))
screen.blit(car2, (300, 100))
screen.blit(car3, (400, 100))
# 更新遊戲畫面
pygame.display.update()
# 執行遊戲迴圈函式
gameloop()
這樣,我們就成功地實作了主車的移動控制,並且解決了車輛持續移動的問題。接下來,我們可以繼續新增更多的功能,例如邊界檢測、碰撞檢測等,以使遊戲更加完善。
開發 PyGame 賽車遊戲:加入邊界與隨機敵方車輛
在前面的章節中,我們已經學會瞭如何使用 PyGame 建立一個基本的賽車遊戲,並實作了玩家控制的車輛移動。在本章節中,我們將進一步增強遊戲功能,加入邊界限制以防止車輛超出遊戲視窗,並實作敵方車輛的隨機出現。
設定遊戲邊界
首先,我們需要為遊戲加入邊界,以限制玩家控制的車輛只能在指定的區域內移動。這可以透過檢查車輛的位置並在超出邊界時進行調整來實作。
程式碼實作:
# 設定邊界限制
if maincarX < 178:
maincarX = 178
if maincarX > 490:
maincarX = 490
if maincarY < 0:
maincarY = 0
if maincarY > 495:
maincarY = 495
內容解密:
這段程式碼檢查 maincarX 和 maincarY 的值是否超出了預設的邊界。如果超出,則將其重置為邊界值,以確保車輛不會移動到遊戲視窗之外。
顯示隨機敵方車輛
接下來,我們將透過匯入 random 模組來實作敵方車輛的隨機出現。我們將使用這個模組來隨機生成敵方車輛的 X 軸位置,使其出現在遊戲區域內的任意位置。
程式碼實作:
import random
# 設定敵方車輛的初始位置
enemy_car_X = random.randint(178, 490)
內容解密:
這行程式碼使用 random.randint(178, 490) 生成一個介於 178 和 490 之間的隨機整數,代表敵方車輛的 X 軸位置。這個範圍是根據遊戲的邊界設定的,確保敵方車輛出現在可視的遊戲區域內。
結合邊界與隨機敵方車輛的遊戲實作
以下是結合了邊界限制和隨機敵方車輛的遊戲完整程式碼範例:
import pygame
import random
pygame.init()
# 初始化 PyGame
from pygame.locals import *
# 設定遊戲視窗大小
screen = pygame.display.set_mode((798, 600))
# 更改遊戲視窗標題
pygame.display.set_caption('Racing Beast')
# 載入並設定遊戲 logo
logo = pygame.image.load('car game/logo.jpeg')
pygame.display.set_icon(logo)
def gameloop():
# 載入背景圖片
bg = pygame.image.load('car game/bg.png')
# 載入玩家車輛圖片
maincar = pygame.image.load('car game/car.png')
maincarX = 350
maincarY = 495
maincarX_change = 0
maincarY_change = 0
# 載入敵方車輛圖片
car1 = pygame.image.load('car game/car1.jpeg')
car2 = pygame.image.load('car game/car2.png')
car3 = pygame.image.load('car game/car3.png')
# 設定敵方車輛的初始位置(隨機)
enemy_car1_X = random.randint(178, 490)
enemy_car2_X = random.randint(178, 490)
enemy_car3_X = random.randint(178, 490)
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
# 檢查是否有按鍵被按下
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
maincarX_change += 5
if event.key == pygame.K_LEFT:
maincarX_change -= 5
if event.key == pygame.K_UP:
maincarY_change -= 5
if event.key == pygame.K_DOWN:
maincarY_change += 5
# 檢查按鍵是否已釋放
if event.type == pygame.KEYUP:
if event.key in (pygame.K_RIGHT, pygame.K_LEFT, pygame.K_UP, pygame.K_DOWN):
maincarX_change = 0
maincarY_change = 0
# 更新玩家車輛位置
maincarX += maincarX_change
maincarY += maincarY_change
# 設定邊界限制
if maincarX < 178:
maincarX = 178
if maincarX > 490:
maincarX = 490
if maincarY < 0:
maincarY = 0
if maincarY > 495:
maincarY = 495
# 清除螢幕並重新繪製背景和車輛
screen.fill((0,0,0))
screen.blit(bg, (0,0))
screen.blit(maincar, (maincarX, maincarY))
screen.blit(car1, (enemy_car1_X, 100))
screen.blit(car2, (enemy_car2_X, 200))
screen.blit(car3, (enemy_car3_X, 300))
# 更新顯示內容
pygame.display.update()
gameloop()
圖表翻譯:
此程式碼流程如下圖所示:
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Pygame 賽車遊戲開發 車輛移動與邊界控制
package "圖論網路分析" {
package "節點層" {
component [節點 A] as nodeA
component [節點 B] as nodeB
component [節點 C] as nodeC
component [節點 D] as nodeD
}
package "中心性指標" {
component [度中心性
Degree Centrality] as degree
component [特徵向量中心性
Eigenvector Centrality] as eigen
component [介數中心性
Betweenness Centrality] as between
component [接近中心性
Closeness Centrality] as close
}
}
nodeA -- nodeB
nodeA -- nodeC
nodeB -- nodeD
nodeC -- nodeD
nodeA --> degree : 計算連接數
nodeA --> eigen : 計算影響力
nodeB --> between : 計算橋接度
nodeC --> close : 計算距離
note right of degree
直接連接數量
衡量局部影響力
end note
note right of eigen
考慮鄰居重要性
衡量全局影響力
end note
@enduml圖表翻譯: 此圖示呈現了遊戲的執行流程,從初始化 PyGame、載入資源到進入主迴圈處理事件、更新遊戲狀態及繪製畫面,每一步驟均清晰標示於圖中。