在不降低帧速率的情况下减慢PyGame精灵动画

时间:2015-04-17 14:53:58

标签: python animation pygame sprite

我正在尝试学习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()

3 个答案:

答案 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 ,可以将其用作索引。

现在,如果游戏的帧速率波动,那就不重要了,因为精灵的帧速率与系统时钟有关。精灵应该仍然尽可能接近所选择的帧速率。