Python遊戲編程之事件監聽(四)

本教程是《Python遊戲編程》系列的第4節,如果您還沒有學習第3節,請看這裡:

Python遊戲編程之創建精靈(三)

我們教程的目標是創建一個有趣的賽車遊戲,在前面的教程中,我們學習瞭如何使用Pygame繪製道路、如何創建汽車類,以及如何使用類來創建我們的第一個對象。

不過,我們的遊戲仍然是靜止的,只有可以使用鼠標或鍵盤交互的遊戲才是有趣的,那麼我們今天的課程內容,就是在作品的主程序循環中添加事件處理程序來響應鍵盤事件。當玩家使用鍵盤中左右方向鍵時,我們需要使得汽車動起來,開始吧!

Python遊戲編程之事件監聽(四)

鼠標和鍵盤是遊戲交互的主要方式


第1步:向汽車類中添加控制函數

我們打開在第2節課中編寫的汽車類,添加最下面的兩段代碼:moveRight、moveLeft。如下所示:

<code>import pygame

WHITE = (255, 255, 255)

class Car(pygame.sprite.Sprite):
    def __init__(self, color, width, height):
        super().__init__()
        self.image = pygame.Surface([width, height])
        self.image.fill(WHITE)
        pygame.draw.rect(self.image, color, [0, 0, width, height])

        self.rect = self.image.get_rect()

    def moveRight(self, pixels):
        self.rect.x += pixels

    def moveLeft(self, pixels):
        self.rect.x -= pixels/<code>

正如你看到的,我們添加了兩個方法。在面向對象編程(OOP)中,對象所具備的能力,我們稱之為方法。例如人會吃飯,會跑步一樣。讓我們來看看MoveRight的這個方法。

<code>def moveRight(self, pixels):
		self.rect.x += pixels/<code>

MoveRight方法需要兩個參數。第一個是隱含的,被稱為self,它指的是當前對象,也就是自己。第二個被稱為像素,指的是我們要將汽車移動的距離(像素數)。

我們的方法的主體只包含一行:self.rect.x += pixels,就是在當前座標上再移動多少像素的距離。

第2步:響應鍵盤事件

Python遊戲編程之事件監聽(四)

我們需要使用方向鍵來控制小車

讓我們看一下主程序的代碼。你可能還記得,在第一個教程中,我們談到了主程序循環。該循環的第一部分就是響應事件的地方,例如處理用戶的鼠標或鍵盤的操作。我們來看如下代碼:

<code>for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                playerCar.moveLeft(5)
            if event.key == pygame.K_RIGHT:
                playerCar.moveRight(5)/<code>

這是事件主循環的代碼,我們可以判斷事件的類型是否是鍵盤按下事件(KEYDOWN),如果是的話,我們再來判斷是屬於哪個鍵,例如是否是左方向鍵(K_LEFT)、右方向鍵(K_RIGHT)等,並在對應的邏輯中進行賽車的移動。

如下為完整的代碼邏輯,開始動起來吧!

<code>import pygame, random, sys
from car import Car

pygame.init()

GREEN = (20, 255, 140)
GREY = (210, 210, 210)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
PURPLE = (255, 0, 255)

SCREENWIDTH = 400
SCREENHEIGHT = 500

size = (SCREENWIDTH, SCREENHEIGHT)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("F1賽車遊戲")

all_sprites_list = pygame.sprite.Group()
playerCar = Car(RED, 20, 30)
playerCar.rect.x = 185
playerCar.rect.y = 300

all_sprites_list.add(playerCar)

clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                playerCar.moveLeft(5)
            if event.key == pygame.K_RIGHT:
                playerCar.moveRight(5)

    all_sprites_list.update()
    screen.fill(GREEN)

    pygame.draw.rect(screen, GREY, [40, 0, 320, 500])
    pygame.draw.line(screen, WHITE, [198, 0], [190, 500], 5)
    all_sprites_list.draw(screen)

    pygame.display.flip()
    clock.tick(60)

pygame.quit()/<code>

如下是我們代碼的運行效果:

Python遊戲編程之事件監聽(四)

我們酷酷的賽車遊戲


好了,本節課程我們已經為賽車遊戲添加了事件函數,讓賽車可以動起來,開始享受你的成果吧!


如果你喜歡我的文章,歡迎您關注我的頭條號:@科技時代聊編程,也歡迎觀看我的《跟我學Python,創意編程之旅》的系列原創編程視頻,每天都有精彩視頻等你喔!


分享到:


相關文章: