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

Pygame-Animations-Sprite-Sheet

WBOY
Freigeben: 2024-02-12 08:12:04
nach vorne
703 Leute haben es durchsucht

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)
Nach dem Login kopieren

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"]
Nach dem Login kopieren

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"]
Nach dem Login kopieren

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"
Nach dem Login kopieren

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
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage