pygame动画精灵表

2024年 2月 12日 63.3k 0

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动画精灵表的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论