Heim >Backend-Entwicklung >Python-Tutorial >Pygame-Animations-Sprite-Sheet

Pygame-Animations-Sprite-Sheet

WBOY
WBOYnach vorne
2024-02-12 08:12:04685Durchsuche

Pygame-Animations-Sprite-Sheet

Frageninhalt

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


Richtige Antwort


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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen