Ich möchte mit Sprite Sheets ein Top-Down-Rollenspiel in Pygame erstellen.
Zum Beispiel möchte ich zum Angreifen die Leertaste drücken können, wodurch die Angriffsanimation ausgelöst wird und dann zum Normalzustand zurückkehrt
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)
Der Code oben ist der, den ich habe. Wenn ich die Leertaste einmal drücke, durchläuft sie die Animation und stoppt. Wenn ich jedoch die Leertaste zweimal drücke, läuft sie aufgrund der Programmierung in einer Schleife ab.
Benötige Hilfe bei Animationen, danke
Das Problem wird durch den folgenden Aufruf verursacht, wenn die Leertaste ein zweites Mal gedrückt wird:
joshua.status["prev"] = joshua.status["now"]
Dadurch wird der Status „Vorheriger“ und „Jetzt“ auf „Angriff“ gesetzt.
Wenn der Status in der animate_attack()
-Methode zurückgesetzt wird,
Es bleibt „Angriff“:
joshua.status["now"] = joshua.status["prev"]
Als schnelle Lösung stellen Sie sicher, dass Sie den Status nur ändern, wenn er noch nicht festgelegt wurde:
if event.key == pygame.k_space: if not joshua.status["now"] == "attacking": joshua.status["prev"] = joshua.status["now"] joshua.status["now"] = "attacking"
Als bessere Lösung sollten Sie den Zustand kapseln, Auf diese Weise kann nur die Spielerklasse ihren eigenen Status verarbeiten, zum Beispiel:
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
Auf diese Weise ist es nicht erforderlich, den Status außerhalb der Klasse zu kennen:
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)
Das obige ist der detaillierte Inhalt vonPygame-Animations-Sprite-Sheet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!