您好,登錄后才能下訂單哦!
怎么用Pygame使你的游戲角色移動起來,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
我們將使用 Pygame 來添加鍵盤控制,如此一來你就可以控制你的角色的移動。
在 Pygame 中有許多函數可以用來添加(除鍵盤外的)其他控制,但如果你正在敲擊 Python 代碼,那么你一定是有一個鍵盤的,這將成為我們接下來會使用的控制方式。一旦你理解了鍵盤控制,你可以自己去探索其他選項。
在本系列的第二篇文章中,你已經為退出游戲創建了一個按鍵,移動角色的(按鍵)原則也是相同的。但是,使你的角色移動起來要稍微復雜一點。
讓我們從簡單的部分入手:設置控制器按鍵。
在 IDLE、Ninja-IDE 或文本編輯器中打開你的 Python 游戲腳本。
因為游戲需要時刻“監聽”鍵盤事件,所以你寫的代碼需要連續運行。你知道應該把需要在游戲周期中持續運行的代碼放在哪里嗎?
如果你回答“放在主循環中”,那么你是正確的!記住除非代碼在循環中,否則(大多數情況下)它只會運行僅一次。如果它被寫在一個從未被使用的類或函數中,它可能根本不會運行。
要使 Python 監聽傳入的按鍵,將如下代碼添加到主循環。目前的代碼還不能產生任何的效果,所以使用 print
語句來表示成功的信號。這是一種常見的調試技術。
while main == True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit(); sys.exit() main = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT or event.key == ord('a'): print('left') if event.key == pygame.K_RIGHT or event.key == ord('d'): print('right') if event.key == pygame.K_UP or event.key == ord('w'): print('jump') if event.type == pygame.KEYUP: if event.key == pygame.K_LEFT or event.key == ord('a'): print('left stop') if event.key == pygame.K_RIGHT or event.key == ord('d'): print('right stop') if event.key == ord('q'): pygame.quit() sys.exit() main = False
一些人偏好使用鍵盤字母 W
、A
、S
和 D
來控制玩家角色,而另一些偏好使用方向鍵。因此確保你包含了兩種選項。
注意:當你在編程時,同時考慮所有用戶是非常重要的。如果你寫代碼只是為了自己運行,那么很可能你會成為你寫的程序的唯一用戶。更重要的是,如果你想找一個通過寫代碼賺錢的工作,你寫的代碼就應該讓所有人都能運行。給你的用戶選擇權,比如提供使用方向鍵或 WASD 的選項,是一個優秀程序員的標志。
使用 Python 啟動你的游戲,并在你按下“上下左右”方向鍵或 A
、D
和 W
鍵的時候查看控制臺窗口的輸出。
$ python ./your-name_game.py left left stop right right stop jump
這驗證了 Pygame 可以正確地檢測按鍵。現在是時候來完成使妖精移動的艱巨任務了。
為了使你的妖精移動起來,你必須為你的妖精創建一個屬性代表移動。當你的妖精沒有在移動時,這個變量被設為 0
。
如果你正在為你的妖精設置動畫,或者你決定在將來為它設置動畫,你還必須跟蹤幀來使走路循環保持在軌跡上。
在 Player
類中創建如下變量。開頭兩行作為上下文對照(如果你一直跟著做,你的代碼中就已經有這兩行),因此只需要添加三行:
def __init__(self): pygame.sprite.Sprite.__init__(self) self.movex = 0 # 沿 X 方向移動 self.movey = 0 # 沿 Y 方向移動 self.frame = 0 # 幀計數
設置好了這些變量,是時候去為妖精移動編寫代碼了。
玩家妖精不需要時刻響應控制,有時它并沒有在移動。控制妖精的代碼,僅僅只是玩家妖精所有能做的事情中的一小部分。在 Python 中,當你想要使一個對象做某件事并獨立于剩余其他代碼時,你可以將你的新代碼放入一個函數。Python 的函數以關鍵詞 def
開頭,(該關鍵詞)代表了定義函數。
在你的 Player
類中創建如下函數,來為你的妖精在屏幕上的位置增加幾個像素。現在先不要擔心你增加幾個像素,這將在后續的代碼中確定。
def control(self,x,y): ''' 控制玩家移動 ''' self.movex += x self.movey += y
為了在 Pygame 中移動妖精,你需要告訴 Python 在新的位置重繪妖精,以及這個新位置在哪里。
因為玩家妖精并不總是在移動,所以更新只需要是 Player 類中的一個函數。將此函數添加前面創建的 control
函數之后。
要使妖精看起來像是在行走(或者飛行,或是你的妖精應該做的任何事),你需要在按下適當的鍵時改變它在屏幕上的位置。要讓它在屏幕上移動,你需要將它的位置(由 self.rect.x
和 self.rect.y
屬性指定)重新定義為當前位置加上已應用的任意 movex
或 movey
。(移動的像素數量將在后續進行設置。)
def update(self): ''' 更新妖精位置 ''' self.rect.x = self.rect.x + self.movex
對 Y 方向做同樣的處理:
self.rect.y = self.rect.y + self.movey
對于動畫,在妖精移動時推進動畫幀,并使用相應的動畫幀作為玩家的圖像:
# 向左移動 if self.movex < 0: self.frame += 1 if self.frame > 3*ani: self.frame = 0 self.image = self.images[self.frame//ani] # 向右移動 if self.movex > 0: self.frame += 1 if self.frame > 3*ani: self.frame = 0 self.image = self.images[(self.frame//ani)+4]
通過設置一個變量來告訴代碼為你的妖精位置增加多少像素,然后在觸發你的玩家妖精的函數時使用這個變量。
首先,在你的設置部分創建這個變量。在如下代碼中,開頭兩行是上下文對照,因此只需要在你的腳本中增加第三行代碼:
player_list = pygame.sprite.Group()player_list.add(player)steps = 10 # 移動多少個像素
現在你已經有了適當的函數和變量,使用你的按鍵來觸發函數并將變量傳遞給你的妖精。
為此,將主循環中的 print
語句替換為玩家妖精的名字(player
)、函數(.control
)以及你希望玩家妖精在每個循環中沿 X 軸和 Y 軸移動的步數。
if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT or event.key == ord('a'): player.control(-steps,0) if event.key == pygame.K_RIGHT or event.key == ord('d'): player.control(steps,0) if event.key == pygame.K_UP or event.key == ord('w'): print('jump') if event.type == pygame.KEYUP: if event.key == pygame.K_LEFT or event.key == ord('a'): player.control(steps,0) if event.key == pygame.K_RIGHT or event.key == ord('d'): player.control(-steps,0) if event.key == ord('q'): pygame.quit() sys.exit() main = False
記住,steps
變量代表了當一個按鍵被按下時,你的妖精會移動多少個像素。如果當你按下 D
或右方向鍵時,你的妖精的位置增加了 10 個像素。那么當你停止按下這個鍵時,你必須(將 step
)減 10(-steps
)來使你的妖精的動量回到 0。
現在嘗試你的游戲。注意:它不會像你預想的那樣運行。
為什么你的妖精仍無法移動?因為主循環還沒有調用 update
函數。
將如下代碼加入到你的主循環中來告訴 Python 更新你的玩家妖精的位置。增加帶注釋的那行:
player.update() # 更新玩家位置 player_list.draw(world) pygame.display.flip() clock.tick(fps)
再次啟動你的游戲來見證你的玩家妖精在你的命令下在屏幕上來回移動。現在還沒有垂直方向的移動,因為這部分函數會被重力控制,不過這是另一篇文章中的課程了。
與此同時,如果你擁有一個搖桿,你可以嘗試閱讀 Pygame 中 joystick 模塊相關的文檔,看看你是否能通過這種方式讓你的妖精移動起來。或者,看看你是否能通過鼠標與你的妖精互動。
最重要的是,玩的開心!
為了方便查閱,以下是目前本系列文章用到的所有代碼。
#!/usr/bin/env python3# 繪制世界# 添加玩家和玩家控制# 添加玩家移動控制 # GNU All-Permissive License# Copying and distribution of this file, with or without modification,# are permitted in any medium without royalty provided the copyright# notice and this notice are preserved. This file is offered as-is,# without any warranty. import pygameimport sysimport os '''Objects''' class Player(pygame.sprite.Sprite): ''' 生成玩家 ''' def __init__(self): pygame.sprite.Sprite.__init__(self) self.movex = 0 self.movey = 0 self.frame = 0 self.images = [] for i in range(1,5): img = pygame.image.load(os.path.join('images','hero' + str(i) + '.png')).convert() img.convert_alpha() img.set_colorkey(ALPHA) self.images.append(img) self.image = self.images[0] self.rect = self.image.get_rect() def control(self,x,y): ''' 控制玩家移動 ''' self.movex += x self.movey += y def update(self): ''' 更新妖精位置 ''' self.rect.x = self.rect.x + self.movex self.rect.y = self.rect.y + self.movey # 向左移動 if self.movex < 0: self.frame += 1 if self.frame > 3*ani: self.frame = 0 self.image = self.images[self.frame//ani] # 向右移動 if self.movex > 0: self.frame += 1 if self.frame > 3*ani: self.frame = 0 self.image = self.images[(self.frame//ani)+4] '''設置'''worldx = 960worldy = 720 fps = 40 # 幀刷新率ani = 4 # 動畫循環clock = pygame.time.Clock()pygame.init()main = True BLUE = (25,25,200)BLACK = (23,23,23 )WHITE = (254,254,254)ALPHA = (0,255,0) world = pygame.display.set_mode([worldx,worldy])backdrop = pygame.image.load(os.path.join('images','stage.png')).convert()backdropbox = world.get_rect()player = Player() # 生成玩家player.rect.x = 0player.rect.y = 0player_list = pygame.sprite.Group()player_list.add(player)steps = 10 # 移動速度 '''主循環'''while main == True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit(); sys.exit() main = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT or event.key == ord('a'): player.control(-steps,0) if event.key == pygame.K_RIGHT or event.key == ord('d'): player.control(steps,0) if event.key == pygame.K_UP or event.key == ord('w'): print('jump') if event.type == pygame.KEYUP: if event.key == pygame.K_LEFT or event.key == ord('a'): player.control(steps,0) if event.key == pygame.K_RIGHT or event.key == ord('d'): player.control(-steps,0) if event.key == ord('q'): pygame.quit() sys.exit() main = False # world.fill(BLACK) world.blit(backdrop, backdropbox) player.update() player_list.draw(world) # 更新玩家位置 pygame.display.flip() clock.tick(fps)
看完上述內容,你們掌握怎么用Pygame使你的游戲角色移動起來的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。