我想使用精靈表在 pygame 中建立一個自上而下的 rpg。
例如,我希望能夠按空白鍵進行攻擊,這會觸發攻擊動畫,然後恢復正常
import pygame from pygame.locals import * pygame.init() image = pygame.image.load("sprite_sheet.png") clock = pygame.time.Clock() screen = pygame.display.set_mode((400, 250)) class Player(pygame.sprite.Sprite): def __init__(self): super().__init__() self.current_animation = 0 self.max_animation = 5 self.animation_cooldown = 150 self.last_animation = pygame.time.get_ticks() self.status = {"prev": "standing", "now": "standing"} def animate_attack(self): time_now = pygame.time.get_ticks() if time_now - self.last_animation >= self.animation_cooldown: self.last_animation = pygame.time.get_ticks() if self.current_animation == self.max_animation: self.current_animation = 0 joshua.status["now"] = joshua.status["prev"] else: self.current_animation += 1 joshua = Player() while True: screen.fill(0) for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: joshua.status["prev"] = joshua.status["now"] joshua.status["now"] = "attacking" if joshua.status["now"] == "attacking": joshua.animate_attack() screen.blit(image, (0, 0), (joshua.current_animation * 64, 0, 64, 64)) pygame.display.flip() clock.tick(60)
上面的程式碼是我所擁有的。如果我按一次空白鍵,它會遍歷動畫並停止,但如果我按兩次空白鍵,它會循環播放,因為它是如何編程的。
需要一些動畫方面的幫助,謝謝
#問題是由第二次按下空格時的以下呼叫引起的:
joshua.status["prev"] = joshua.status["now"]
這會將「上一個」和「現在」狀態設為「攻擊」。
結果,當在 animate_attack()
方法中重置狀態時,
它將保持“攻擊”狀態:
joshua.status["now"] = joshua.status["prev"]
作為快速修復,請確保僅在尚未設定狀態時才變更狀態:
if event.key == pygame.k_space: if not joshua.status["now"] == "attacking": joshua.status["prev"] = joshua.status["now"] joshua.status["now"] = "attacking"
作為更好的修復,您應該封裝狀態, 這樣只有 player 類別才能處理它自己的狀態,例如:
class player(): def __init__(self): self.current_animation = 0 self.max_animation = 5 self.animation_cooldown = 150 self.last_animation = pygame.time.get_ticks() self.status = "standing" # simplified state def attack(self): self.status = "attacking" def animate_attack(self): if self.status == "attacking": time_now = pygame.time.get_ticks() if time_now - self.last_animation >= self.animation_cooldown: self.last_animation = pygame.time.get_ticks() if self.current_animation == self.max_animation: self.current_animation = 0 self.status = "standing" # reset state else: self.current_animation += 1
這樣,就不需要知道類別外部的任何狀態:
while True: for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: joshua.attack() joshua.animate_attack() screen.fill(0) screen.blit(image, (0, 0), (joshua.current_animation * 64, 0, 64, 64)) pygame.display.flip() clock.tick(60)
以上是pygame動畫精靈表的詳細內容。更多資訊請關注PHP中文網其他相關文章!