3.2 move()方法的定義
Player類的move()方法用于玩家控制汽車左右移動,當玩家點擊鍵盤上的左右按鍵時,汽車會相應地進行左右移動。
move()方法的代碼如圖7所示。
圖7 move()方法的代碼
其中,第20行代碼通過pygame.key.get_pressed()函數獲取鍵盤中所有按鍵的狀態,并將其保存在變量pressed_keys中,當玩家按下了向左的按鍵,pressed_keys[K_LEFT]的值是True,當玩家按下了向右的按鍵,pressed_keys[K_RIGHT]的值是True。第22-24行代碼中,首先判斷玩家汽車的位置是否已經到了屏幕的最左端,如果沒有在屏幕最左端,則第23行代碼判斷玩家是否按下了向左的按鍵,如果該按鍵被按下則第24行代碼將玩家汽車的位置向左移動5個單位。第22-24行代碼保證了如果玩家汽車位于屏幕最左端,此時不會再移動到屏幕之外。同理,第25-27行代碼是對用戶按下了向右按鍵的處理,第25行代碼判斷玩家汽車是否位于屏幕的最右端,如果沒有在最右端,則第26行代碼判斷玩家是否按下了向右的按鍵,如果該按鍵被按下則第27行代碼將玩家汽車的位置向右移動5個單位。第25-27行代碼保證了如果玩家汽車位于屏幕最右端,此時不會再移動到屏幕之外。
相關鏈接5 ?Pygame的Rect類的資料,請參考
《Pygame中Rect類的使用方法2-1》
《Pygame中Rect類的使用方法2-2》
相關鏈接6 Pygame的鍵盤監聽資料,請參考
《Pygame中監控鍵盤按鍵的方法》
4 實例化Player類及相關處理
4.1 實例化Player類
通過圖8所示的代碼實例化Player類。
圖8 實例化Player類的代碼
其中, P1是Player類的實例。
4.2 將P1加入到精靈組中
P1是Player類的實例,而Player類是pygame.sprite.Sprite類的子類,因此P1可以看作是一個“精靈”。將“精靈”加入到“精靈組”可以方便對多個“精靈”進行批量處理。代碼如圖9所示。
圖9 將P1加入到精靈組的代碼
其中,第29行通過pygame.sprite.Group()創建“精靈組”all_sprites,該“精靈組”中將會包含游戲中的所有“精靈”,即包含玩家也包含“敵人”。
4.3 顯示及控制玩家汽車
在while True循環中,通過“精靈組”all_sprites實現顯示及控制玩家汽車的功能,代碼如圖10所示。
圖10 顯示及控制玩家汽車的代碼
其中,第39行代碼通過for循環遍歷“精靈組”all_sprites中的所有精靈(目前組里面只有玩家一個精靈),之后第40行代碼調用精靈的move()方法控制“精靈”的移動;第41行代碼繪制“精靈”。
運行代碼后,游戲的效果如圖11所示。
圖11 游戲效果
5 完整代碼
以上內容的完整代碼如下所示。
import pygame
import os
from pygame.locals import *WIDTH = 400
HEIGHT = 600
pygame.init()
screen = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption('賽車游戲')background = pygame.image.load("AnimatedStreet.png")class Player(pygame.sprite.Sprite):def __init__(self):super().__init__() self.image = pygame.image.load("Player.png")self.rect = self.image.get_rect()self.rect.center = (160, 520)def move(self):pressed_keys = pygame.key.get_pressed()if self.rect.left > 0:if pressed_keys[K_LEFT]:self.rect.move_ip(-5, 0)if self.rect.right < WIDTH: if pressed_keys[K_RIGHT]:self.rect.move_ip(5, 0)
P1 = Player()
all_sprites = pygame.sprite.Group()
all_sprites.add(P1)while True:for event in pygame.event.get():if event.type == QUIT:pygame.quit()os.sys.exit()screen.blit(background, (0,0))for entity in all_sprites:entity.move()screen.blit(entity.image, entity.rect)pygame.display.update()