解決Pygame精靈會跳但不會走的問題

華科雲商小雪發表於2024-02-07

根據我從事幾年遊戲開發的經驗,我們知道在Pygame中,精靈(Sprite)是遊戲中的基本元素,通常代表遊戲中的角色、物體或動畫。精靈可以執行各種動作,包括移動、跳躍、碰撞檢測等。但是如果我們遇到Pygame精靈能夠跳躍但不能走動,可能有多種問題存在,廢話不多說,直接看下面詳細過程,相信看過了懂的應該都會懂。

問題背景:

在 Pygame 中,建立了一個可以跳躍但是無法正常移動的精靈物件,移動時只能移動幾個畫素,希望解決這個問題,以便精靈物件能夠正常行走。

解決方案:

1、問題分析:

問題主要在於精靈物件的移動速度設定不當,導致精靈物件只能移動幾個畫素。

2、修復程式碼:

class Player(pygame.sprite.Sprite):

   def __init__(self, *groups):
       super(Player, self).__init__(groups)
       self.image = pygame.image.load('Images\player1.png')
       self.rect = pygame.rect.Rect((50, 650), self.image.get_size())
       self.resting = False
       self.dy = 0 #dy represents change in y velocity

   def update(self, dt, game):
       last = self.rect.copy()
       key = pygame.key.get_pressed()
       if key[pygame.K_LEFT]:
           # Increase the move speed to allow the sprite to move smoothly
           self.rect.x -= 500 * dt
       if key[pygame.K_RIGHT]:
           self.rect.x += 500 * dt
       #if key[pygame.K_UP]:
       #    self.rect.y -= 300 * dt
       #if key[pygame.K_DOWN]:
       #    self.rect.y += 300 * dt

       if self.resting and key[pygame.K_SPACE]:
           self.dy = -500 #If space bar is pressed, increase velocity.
       self.dy = min(400, self.dy + 40) #Speed capped at 400. Gravity set at 40.
       self.rect.y += self.dy * dt

       new = self.rect
       self.resting = False
       for cell in pygame.sprite.spritecollide(self, game.walls, False):
           #self.rect = last
           cell = cell.rect
           if last.right <= cell.left and new.right > cell.left:
               new.right = cell.left              
           if last.left >= cell.right and new.left < cell.right:
               new.left = cell.right
           if last.bottom <= cell.top and new.bottom > cell.top:
               #if you hit something while jumping, stop.
               self.resting = True
               new.bottom = cell.top
               self.dy = 0
           if last.top >= cell.bottom and new.top < cell.bottom:
               new.top = cell.bottom
               self.dy = 0 #If you hit the floor while jumping, stop

# Increase the speed of the sprite movement
move_speed = 500
# Modify the update method to update the position of the sprite based on the input
def update(self, dt, game):
   key = pygame.key.get_pressed()
   if key[pygame.K_LEFT]:
       self.rect.x -= move_speed * dt
   if key[pygame.K_RIGHT]:
       self.rect.x += move_speed * dt

3、解釋:

  • class Player : 定義了一個精靈類 Player ,它繼承自 pygame.sprite.Sprite

  • __init__(self, *groups) : Player 的建構函式,初始化精靈物件。

  • update(self, dt, game) : Player 的更新方法,根據輸入更新精靈物件的位置。

    • dt : 時間增量。

    • game : 遊戲物件。

  • move_speed : 定義了精靈物件的移動速度。

  • key : 獲取當前按下的按鍵。

  • if key[pygame.K_LEFT] : 如果按下左鍵,將精靈物件向左移動。

  • if key[pygame.K_RIGHT] : 如果按下右鍵,將精靈物件向右移動。

透過調整 move_speed 的值,可以控制精靈物件的移動速度。

這些資料可以用來建立遊戲中的精靈、地圖、背景音樂等,從而增強遊戲體驗。檢查精靈的移動速度設定,確保速度不是零或非常小。如果速度太小,精靈移動時可能會被視為靜止。所以說,解決了上面的問題,對於遊戲開發是有非常好的效果的。如果各位有問題可以這裡留言討論。



來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3006527/,如需轉載,請註明出處,否則將追究法律責任。

相關文章