本教程是《Python遊戲編程》系列的第4節,如果您還沒有學習第3節,請看這裡:
Python遊戲編程之創建精靈(三)我們教程的目標是創建一個有趣的賽車遊戲,在前面的教程中,我們學習瞭如何使用Pygame繪製道路、如何創建汽車類,以及如何使用類來創建我們的第一個對象。
不過,我們的遊戲仍然是靜止的,只有可以使用鼠標或鍵盤交互的遊戲才是有趣的,那麼我們今天的課程內容,就是在作品的主程序循環中添加事件處理程序來響應鍵盤事件。當玩家使用鍵盤中左右方向鍵時,我們需要使得汽車動起來,開始吧!
第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步:響應鍵盤事件
讓我們看一下主程序的代碼。你可能還記得,在第一個教程中,我們談到了主程序循環。該循環的第一部分就是響應事件的地方,例如處理用戶的鼠標或鍵盤的操作。我們來看如下代碼:
<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,創意編程之旅》的系列原創編程視頻,每天都有精彩視頻等你喔!