我正在尝试学习pygame精灵动画。我试过按照教程,一切都很好。只有一个问题我无法理解。
在下面的代码中,我试图运行简单方形的精灵动画。 这是精灵: https://www.dropbox.com/s/xa39gb6m3k8085c/playersprites.png
我可以让它工作,但动画太快了。我希望它更平滑,以便可以看到褪色效果。我看到了一些使用clock.tick
的解决方案,但这会减慢整个游戏的速度。
如何在维护窗口的常规帧速率的同时让动画变慢?
以下是我的代码:
lightblue=(0,174,255)
import pygame
pygame.init()
screen = pygame.display.set_mode((400, 300))
done = False
screen.fill(lightblue)
images=pygame.image.load('playersprites.png')
noi=16
current_image=0
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
pygame.quit()
quit()
if(current_image>noi-1):
current_image=0
else:
current_image+=1
screen.blit(images,(50,100),(current_image*32,0,32,32))
pygame.display.flip()
答案 0 :(得分:2)
使用您在循环中添加的整数值并检查可除性。有关详情,请参阅here。
答案 1 :(得分:1)
Clock.tick()
是正确的解决方案。
虽然您可能希望尽快运行游戏代码,但您不希望动画以任意速度运行。动画总是"每秒帧数"这个值应该稳定;否则会显得丑陋或令人困惑。一个好的值与您的显示器的刷新率(通常为60 FPS)相同,以避免tearing。
答案 2 :(得分:0)
你可以使用时间
所以你的精灵有16帧,并且假设它想要以每秒10帧的速度运行,无论游戏的帧率如何。
你可以按照
的方式做点什么import time
start_frame = time.time()
noi = 16
frames_per_second = 10
然后在你的循环中
current_image = int((time.time() - start_frame) * frames_per_second % noi)
time.time()以秒为单位计数,并在其后面有几位小数。如果你遗漏 frames_per_second ,那么只需使用 noi 上的模运算符(大概是"图像数量"),每次一秒钟过去,结果将加1,直到达到16并返回0.
当您将 start_frame 与当前时间( time.time())之间的差值相乘时,您会强制执行"秒"快去 frames_per_second 次。
将 float 的结果强制转换为 int ,可以将其用作索引。
现在,如果游戏的帧速率波动,那就不重要了,因为精灵的帧速率与系统时钟有关。精灵应该仍然尽可能接近所选择的帧速率。