返回文章列表

Pygame實作遊戲動態元素與角色控制

本文介紹如何使用 Pygame 實作遊戲中的動態元素,包含敵方車輛的隨機出現、移動,以及玩家角色的鍵盤控制與邊界限制。文章涵蓋 Pygame 的初始化、事件處理、影像載入與顯示、角色移動控制等核心概念,並提供程式碼範例與說明,幫助讀者理解如何在 Pygame 中建立動態且具有互動性的遊戲元素。

遊戲開發 Python

Pygame 提供了便捷的工具和函式,方便開發者建立 2D 遊戲。本文的程式碼範例展示瞭如何使用 Pygame 載入和顯示影像、處理鍵盤事件,以及控制遊戲角色的移動。其中,敵方車輛的隨機出現和移動是透過在遊戲迴圈中不斷更新敵方車輛的 Y 座標,並在超出螢幕範圍時重置位置和 X 座標實作的。玩家角色的移動則藉由監聽鍵盤事件,並根據按下的方向鍵來改變角色的 X 和 Y 座標,同時限制角色在遊戲視窗邊界內移動,避免超出螢幕範圍。程式碼中也包含了 Pygame 的初始化、遊戲視窗的設定、影像的載入和顯示等基本操作,提供了一個完整的遊戲開發流程範例。

遊戲開發:實作敵方車輛的隨機出現與移動

在遊戲開發中,創造一個動態且具有挑戰性的環境是至關重要的。本文將詳細介紹如何使用Pygame實作敵方車輛的隨機出現與移動,從而增強遊戲的可玩性。

初始化與設定

首先,我們需要初始化Pygame並設定遊戲視窗的基本屬性,包括標題和圖示。

import pygame
import random

pygame.init()
screen = pygame.display.set_mode((798, 600))
pygame.display.set_caption('Racing Beast')
logo = pygame.image.load('car game/logo.jpeg')
pygame.display.set_icon(logo)

內容解密:

  • pygame.init() 初始化Pygame模組。
  • pygame.display.set_mode((798, 600)) 設定遊戲視窗的大小為798x600畫素。
  • pygame.display.set_caption('Racing Beast') 設定遊戲視窗的標題。
  • pygame.display.set_icon(logo) 設定遊戲視窗的圖示。

定義遊戲迴圈

接下來,我們定義一個名為gameloop的函式來控制遊戲的主要邏輯。

def gameloop():
    bg = pygame.image.load('car game/bg.png')
    maincar = pygame.image.load('car game/car.png')
    maincarX, maincarY = 350, 495
    maincarX_change, maincarY_change = 0, 0
    
    car1 = pygame.image.load('car game/car1.jpeg')
    car1X, car1Y = random.randint(178, 490), 100
    car2 = pygame.image.load('car game/car2.png')
    car2X, car2Y = random.randint(178, 490), 100
    car3 = pygame.image.load('car game/car3.png')
    car3X, car3Y = random.randint(178, 490), 100
    
    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, maincarY_change = 0, 0
        
        # 更新主車位置
        maincarX += maincarX_change
        maincarY += maincarY_change
        
        # 限制主車在遊戲區域內移動
        maincarX = max(178, min(maincarX, 490))
        maincarY = max(0, min(maincarY, 495))
        
        # 更新敵方車輛位置
        car1Y += 10
        car2Y += 10
        car3Y += 10
        
        # 重置敵方車輛位置(若超出螢幕範圍)
        if car1Y > 600:
            car1X, car1Y = random.randint(178, 490), -100
        if car2Y > 600:
            car2X, car2Y = random.randint(178, 490), -200
        if car3Y > 600:
            car3X, car3Y = random.randint(178, 490), -300
        
        # 繪製遊戲畫面
        screen.fill((0,0,0))
        screen.blit(bg, (0,0))
        screen.blit(maincar, (maincarX, maincarY))
        screen.blit(car1, (car1X, car1Y))
        screen.blit(car2, (car2X, car2Y))
        screen.blit(car3, (car3X, car3Y))
        
        pygame.display.update()

gameloop()

圖表翻譯:

此程式碼展示瞭如何實作一個簡單的賽車遊戲,包括主車的控制、敵方車輛的隨機出現和移動。程式使用Pygame函式庫來處理圖形和事件。

程式碼重點解析

  1. 隨機生成敵方車輛:利用random.randint(178, 490)來隨機決定敵方車輛的初始X座標,使其在遊戲區域內隨機出現。
  2. 敵方車輛移動:透過增加敵方車輛的Y座標值(例如car1Y += 10),使敵方車輛向下移動,模擬行駛效果。
  3. 重設敵方車輛位置:當敵方車輛移出螢幕範圍後,重新設定其位置和隨機X座標,使其在上方重新出現,實作無限迴圈的效果。

使用Pygame實作遊戲元素移動

在上一章節中,我們已經學習瞭如何在Pygame中新增影像,現在我們將繼續探討如何使用Pygame使遊戲元素移動。在本篇文章中,我們將學習如何使用箭頭鍵移動影像。

初始化Pygame及設定遊戲視窗

首先,我們需要初始化Pygame並建立一個遊戲視窗。程式碼如下:

import pygame
pygame.init()
screen = pygame.display.set_mode((800,600))
pygame.display.set_caption("遊戲範例")
isRunning = True

內容解密:

  • pygame.init():初始化Pygame模組。
  • pygame.display.set_mode((800,600)):設定遊戲視窗的大小為800x600畫素。
  • pygame.display.set_caption("遊戲範例"):設定遊戲視窗的標題為「遊戲範例」。

載入影像及設定初始位置

接下來,我們需要載入一個影像並設定其初始位置。

player = pygame.image.load('athlete.png')
playerX = 375
playerY = 500

內容解密:

  • pygame.image.load('athlete.png'):載入名為athlete.png的影像。
  • playerXplayerY:定義影像的初始X和Y座標。

遊戲迴圈及事件處理

在遊戲迴圈中,我們需要處理事件、更新遊戲狀態並渲染影像。

while(isRunning == True):
    screen.fill((167,145,55))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            isRunning = False
    screen.blit(player,(playerX, playerY))
    pygame.display.update()

內容解密:

  • screen.fill((167,145,55)):用指定顏色填充視窗背景。
  • for event in pygame.event.get()::遍歷所有事件。
  • if event.type == pygame.QUIT::檢查是否關閉視窗事件。
  • screen.blit(player,(playerX, playerY)):將影像渲染到指定位置。
  • pygame.display.update():更新整個視窗的顯示。

移動影像

為了使影像移動,我們需要根據按下的箭頭鍵來改變影像的X和Y座標。

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_LEFT:
        playerX -= 10
    if event.key == pygame.K_RIGHT:
        playerX += 10
    if event.key == pygame.K_UP:
        playerY -= 10
    if event.key == pygame.K_DOWN:
        playerY += 10

內容解密:

  • if event.type == pygame.KEYDOWN::檢查是否按下鍵盤事件。
  • event.key == pygame.K_LEFT等:檢查按下的鍵是否為指定的箭頭鍵。
  • playerX -= 10等:根據按下的箭頭鍵改變影像的座標。

無限移動敵人

在我們的遊戲範例中,敵人汽車需要無限地向下移動並在到達視窗底部後重新出現在頂部。

# 移動敵人
car1Y += 10
car2Y += 10
car3Y += 10

# 無限移動敵人
if car1Y > 670:
    car1Y = -100
if car2Y > 670:
    car2Y = -150
if car3Y > 670:
    car3Y = -200

內容解密:

  • car1Y += 10等:使敵人汽車向下移動。
  • if car1Y > 670:等:檢查敵人汽車是否到達視窗底部,如果是,則重新設定其Y座標使其重新出現在頂部。

PyGame 事件處理與玩家移動實作

在 PyGame 中,事件處理是遊戲開發的重要環節。透過事件處理,我們可以捕捉使用者輸入,如鍵盤按鍵、滑鼠移動等,並根據這些輸入做出相應的反應。

事件處理基礎

PyGame 使用 pygame.event.get() 方法來取得事件佇列中的事件。這個方法傳回一個事件列表,我們可以遍歷這個列表來處理每個事件。

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        isRunning = False

在上述程式碼中,我們檢查了 pygame.QUIT 事件,這通常是由於使用者關閉了遊戲視窗觸發的。

鍵盤事件處理

PyGame 提供了多種鍵盤事件,包括 pygame.KEYDOWNpygame.KEYUP。當使用者按下或釋放一個按鍵時,這些事件就會被觸發。

鍵盤事件範例

for event in pygame.event.get():
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_UP:
            print("向上鍵被按下")
        elif event.key == pygame.K_DOWN:
            print("向下鍵被按下")
        elif event.key == pygame.K_LEFT:
            print("向左鍵被按下")
        elif event.key == pygame.K_RIGHT:
            print("向右鍵被按下")

內容解密:

  1. event.type == pygame.KEYDOWN:檢查事件型別是否為按鍵按下事件。
  2. event.key == pygame.K_UP:檢查按下的按鍵是否是向上箭頭鍵。
  3. 使用 elif 陳述句來檢查其他按鍵狀態。

玩家移動實作

要實作玩家移動,我們需要根據鍵盤輸入更新玩家的位置。首先,我們定義兩個變數 XchangeYchange 來表示玩家在 X 和 Y 方向上的變化量。

Xchange = 0
Ychange = 0

while isRunning:
    screen.fill((167, 145, 55))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            isRunning = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                Ychange -= 0.5
            elif event.key == pygame.K_DOWN:
                Ychange += 0.5
            elif event.key == pygame.K_LEFT:
                Xchange -= 0.5
            elif event.key == pygame.K_RIGHT:
                Xchange += 0.5
        if event.type == pygame.KEYUP:
            Ychange = 0
            Xchange = 0

內容解密:

  1. 初始化 XchangeYchange 為 0,表示初始狀態下玩家不移動。
  2. 在遊戲迴圈中,根據 pygame.KEYDOWNpygame.KEYUP 事件更新 XchangeYchange
  3. 當按下向上箭頭鍵時,Ychange 減少 0.5,表示玩家向上移動。
  4. 當按下向下箭頭鍵時,Ychange 增加 0.5,表示玩家向下移動。
  5. 當按下向左或向右箭頭鍵時,相應地更新 Xchange
  6. 當按鍵被釋放時,重置 XchangeYchange 為 0,使玩家停止移動。

PyGame 按鍵常數

PyGame 定義了一系列按鍵常數,用於表示不同的按鍵。例如:

  • pygame.K_UP:向上箭頭鍵
  • pygame.K_DOWN:向下箭頭鍵
  • pygame.K_LEFT:向左箭頭鍵
  • pygame.K_RIGHT:向右箭頭鍵

這些常數可以在檢查按鍵事件時使用。

使用Pygame顯示影像與控制遊戲角色

在前面的章節中,我們已經學習瞭如何使用Pygame建立遊戲視窗並且處理基本的事件。現在,我們將進一步探討如何使用Pygame顯示影像以及控制遊戲角色。

載入與顯示影像

要顯示影像,我們首先需要使用pygame.image.load()函式將影像載入到我們的程式中。這個函式可以接受一個檔案名稱或是檔案物件。

background = pygame.image.load('background.png')

載入影像後,我們需要使用blit()函式將影像繪製到遊戲視窗上。blit()函式的第一個引數是要繪製的影像,第二個引數是影像的左上角座標。

screen.blit(background, (0, 0))

內容解密:

  • pygame.image.load():用於載入影像檔案。
  • blit():用於將一個Surface物件繪製到另一個Surface物件上。

控制遊戲角色

要控制遊戲角色,我們需要處理鍵盤事件。當玩家按下方向鍵時,我們需要更新角色的位置。

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_UP:
        Ychange -= 0.5
    if event.key == pygame.K_DOWN:
        Ychange += 0.5
    if event.key == pygame.K_LEFT:
        Xchange -= 0.5
    if event.key == pygame.K_RIGHT:
        Xchange += 0.5

同時,我們需要檢查角色是否超出遊戲視窗的邊界。如果超出邊界,我們需要阻止角色繼續移動。

if playerX + Xchange > 775 or playerY + Ychange > 565 or playerX + Xchange < 0 or playerY + Ychange < 0:
    playerY += 0
    playerX += 0
else:
    playerY += Ychange
    playerX += Xchange

內容解密:

  • pygame.KEYDOWN:當玩家按下鍵盤按鍵時觸發的事件。
  • XchangeYchange:用於控制角色在X軸和Y軸上的移動速度。
  • 邊界檢查:用於防止角色超出遊戲視窗的邊界。

綜合範例

以下是綜合上述功能的完整程式碼範例:

import pygame

pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("遊戲範例")

isRunning = True
player = pygame.image.load('athlete.png')
playerX = 375
playerY = 500
Xchange = 0
Ychange = 0
background = pygame.image.load('background.png')

while isRunning:
    screen.blit(background, (0, 0))
    screen.fill((167, 145, 55))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            isRunning = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                Ychange -= 0.5
            if event.key == pygame.K_DOWN:
                Ychange += 0.5
            if event.key == pygame.K_LEFT:
                Xchange -= 0.5
            if event.key == pygame.K_RIGHT:
                Xchange += 0.5
        if event.type == pygame.KEYUP:
            Ychange = 0
            Xchange = 0
    
    if playerX + Xchange > 775 or playerY + Ychange > 565 or playerX + Xchange < 0 or playerY + Ychange < 0:
        playerY += 0
        playerX += 0
    else:
        playerY += Ychange
        playerX += Xchange
    
    screen.blit(player, (playerX, playerY))
    pygame.display.update()

圖表翻譯:

此範例展示瞭如何使用Pygame載入影像、控制遊戲角色以及處理鍵盤事件。遊戲角色可以在視窗內移動,並且不會超出邊界。背景影像首先被繪製,然後是遊戲角色。鍵盤事件用於控制角色的移動方向和速度。