我瞎搞与pygame的,做一些简单的游戏只是为了学习。 不过,我有一个很难实现的FPS,我想要的方式。
据我了解,FPS一般设置有:
import pygame
...
clock = pygame.time.Clock()
while True:
clock.tick(60)
然后,在整个程序中,我确保每一个循环/帧被写入采取第二的1/60,这样我就可以,例如,使物体在我想他们太多的速度移动。 蜱提高到120帧将会使游戏运行速度太快,而减少就会使游戏运行速度太慢。
然而,这不是我是如何熟悉任何其他游戏工作FPS。 在大多数游戏中,FPS可以改变,就像你想要的(通常是基于该系统如何运行的应用程序),但游戏总是以相同的速度运行(如移动在屏幕100个像素将需要1秒无事多少帧在第二个发生过)。
我能想到得到它的工作就是我想要的唯一的办法就是抓住当前的FPS每一帧,并因素是进入每一个动作或基于时间的事件的计算。 但是,这似乎是不必要的复杂,我想知道如果我完全缺少的pygame的功能的一部分数字,为我。
游戏使用固定时间步长为物理,同时允许视频时步(fps)的变化。 这意味着你的update(delta)
函数被调用以恒定的delta值。 这将保持稳定。
这意味着,在实践中, update
可能最终会被要求每单平均通话多次draw()
这取决于有多少时间的流逝。
有关详细信息,请参阅: 灯光师的“修复你的时间步长”
较大的(蟒)的例子是在食谱:ConstantGametime
虽然@猴子的答案是完全datadump,你应该看看在对pygame的文档time.Clock
一次。 可选的帧率参数Clock.tick()
设定了FPS,而不是一个固定的FPS上限; 换句话说,如果你的游戏循环时间超过的时间来完成这一数额越长,游戏会如果你假设通过该值可以确保一个固定的游戏速度滞后。 它看起来像Clock.get_time()
和Clock.get_raw_time()
是用来获取最后的游戏循环的执行时间的事情,那么你就可以计算出从你的游戏元素的行为。
您可以定义对象的速度像素/秒,然后用返回值从tick
知道每个对象应该多少移动。
例
import pygame
...
player_speed = (20, 0) # (x,y) pixels/second
...
pygame.time.Clock() = clock
elapsed = 0.
while True:
seconds = elapsed/1000.0
update_player(seconds)
...
elapsed = clock.tick(60)
def update_player(seconds):
player.position = (player.position[0] + int(player_speed[0]*seconds),
player.position[1] + int(player_speed[1]*seconds))
如果你想在一个固定的速度在每一个FPS移动对象,你可以指示的速度不具有绝对价值,但相对于移动的值在第二个做,然后除以每秒的帧数。
例如,如果你希望你的对象以每帧2个像素的速度移动,让我们在30 FPS说,你要这样的速度是一样的,在每一个FPS,你可以指出它的像素移动在第二,这将是60在游戏循环,当你需要更新的速度,你会使用这个速度FPS划分,从而导致在每一帧更新中使用的相对速度。 这样一来,在30 FPS,你会得到每帧2像素的运动,而在60 FPS,你会得到一个1个像素的运动,但在1秒钟后,你将有像素的运动,这是60的相同。