问题内容
我想使用精灵表在 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动画精灵表的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容猜你喜欢
AI推送时光机pygame动画精灵表
后端开发2024-02-12
Python——动画精灵
后端开发2023-01-31
利用pygame完成动画精灵和碰撞检测
后端开发2024-04-02
Pygame浅析动画精灵和碰撞检测实现方法
后端开发2023-01-17
Android精灵动画用法实例
后端开发2022-06-06
Python pygame派生精灵和精灵组创建敌机
后端开发2024-04-02
python使用pygame创建精灵Sprite
后端开发2024-04-02
Pygame如何使用精灵和碰撞检测
后端开发2024-04-02
python使用pygame创建精灵Sprite的案例
后端开发2023-06-14
Pygame怎么使用精灵和碰撞检测
后端开发2023-06-25
Python Pygame中精灵和碰撞检测详解
后端开发2024-04-02
如何安装win7驱动精灵
后端开发2023-07-15
windows驱动精灵怎么备份
后端开发2023-07-01
windows驱动精灵怎么使用
后端开发2023-07-01
windows驱动精灵怎么安装
后端开发2023-07-01
Pygame游戏开发之太空射击实战敌人精灵篇
后端开发2024-04-02
windows驱动精灵usb驱动如何安装
后端开发2023-07-01
windows驱动精灵WiFi驱动怎么安装
后端开发2023-07-01
windows驱动精灵ahci驱动怎么安装
后端开发2023-07-01
电脑驱动精灵如何使用
后端开发2023-07-02
咦!没有更多了?去看看其它编程学习网 内容吧