首頁 > 後端開發 > Python教學 > pygame動畫精靈表

pygame動畫精靈表

WBOY
發布: 2024-02-12 08:12:04
轉載
704 人瀏覽過

pygame動畫精靈表

問題內容

我想使用精靈表在 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中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板