URLhttps://learnscript.net/zh-hant/pygame/sprite/movement/
    複製連結移至說明  範例

    控製精靈移動的兩種方式

    閱讀 3:17·字數 986·更新 
    Youtube 頻道
    訂閱 375

    前言

    在遊戲開發中,角色移動是最基礎也最重要的功能之一。本文將介紹在 Python Pygame 中實作角色移動的兩種主要方式:通過即時取得裝置狀態,然後移動角色;通過事件取得裝置狀態,然後移動角色。

    角色移動的基本原理

    在大多數遊戲中,玩家需要通過輸入裝置(如鍵盤、滑鼠或遊戲控製器)來控製遊戲角色的移動。在 Pygame 中實作這一功能通常分為兩個步驟:取得輸入裝置的狀態(如鍵盤按鍵的按下狀態);根據裝置狀態調整角色的位置。

    方式一:即時取得裝置狀態

    Pygame 提供了keymousejoystick模組,這些模組包含可以即時取得鍵盤、滑鼠和控製器狀態的函式。本文將以key模組為例進行示範,其實作步驟大致如下。

    假設已經定義了一個表示飛機的精靈類別Plane,我們需要覆寫Plane類別的update方法。在update方法中,使用key模組的get_pressed函式檢測方向鍵的按下狀態(當然,你可以指定其他的按鍵來移動角色),根據按鍵狀態修改角色的位置。最後,在遊戲主迴圈中呼叫飛機所在精靈組的update方法。

    下面的程式碼邏輯可能會出現方向鍵優先順序的問題(上方向鍵和左方向鍵優先順序更高)。為了解決這個問題,可以將if陳述式分割為四個獨立的條件判斷,這樣同時按下相反方向鍵時,角色會停止移動。

    def update(self):
    	keys = pygame.key.get_pressed()
    
    if keys[pygame.K_LEFT]: self.rect.x -= 1 elif keys[pygame.K_RIGHT]: self.rect.x += 1
    if keys[pygame.K_UP]: self.rect.y -= 1 elif keys[pygame.K_DOWN]: self.rect.y += 1

    方式二:通過事件取得裝置狀態

    Pygame 的event模組提供了事件處理功能,我們可以通過處理與裝置狀態有關的事件(如按鍵按下和釋放)來實作角色移動,其實作步驟大致如下。

    依然假設已經定義了表示飛機的精靈類別Plane,為其新增表示水平和垂直速度的變數speedxspeedy。修改Planeupdate方法,根據速度變數更新位置。在遊戲迴圈中處理鍵盤事件,修改飛機物件的speedxspeedy變數。

    在遊戲迴圈中,需要處理與按鍵相關的事件,當按鍵按下時設定速度,當按鍵釋放時重設速度為0。重設速度需要檢查目前速度方向,避免錯誤地停止移動。

    def update(self):
    	self.rect.x += self.speedx
    	self.rect.y += self.speedy
    for event in pygame.event.get():
    	if event.type == pygame.KEYDOWN:
    		if event.key == pygame.K_LEFT:
    			plane.speedx = -1
    		elif event.key == pygame.K_RIGHT:
    			plane.speedx = 1
    		elif event.key == pygame.K_UP:
    			plane.speedy = -1
    		elif event.key == pygame.K_DOWN:
    			plane.speedy = 1
    	
    	if event.type == pygame.KEYUP:
    		if event.key == pygame.K_LEFT and plane.speedx < 0:
    			plane.speedx = 0
    		elif event.key == pygame.K_RIGHT and plane.speedx > 0:
    			plane.speedx = 0
    		elif event.key == pygame.K_UP and plane.speedy < 0:
    			plane.speedy = 0
    		elif event.key == pygame.K_DOWN and plane.speedy > 0:
    			plane.speedy = 0

    講解影片

    Pygame 控製角色移動的兩種方式·YouTube