我想使用精灵表在 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中文网其他相关文章!