在pygame的,归在不同的FPS值的游戏速度(In Pygame, normalizing gam

2019-07-04 05:06发布

我瞎搞与pygame的,做一些简单的游戏只是为了学习。 不过,我有一个很难实现的FPS,我想要的方式。

据我了解,FPS一般设置有:

import pygame
...
clock = pygame.time.Clock()
while True:
    clock.tick(60)

然后,在整个程序中,我确保每一个循环/帧被写入采取第二的1/60,这样我就可以,例如,使物体在我想他们太多的速度移动。 蜱提高到120帧将会使游戏运行速度太快,而减少就会使游戏运行速度太慢。

然而,这不是我是如何熟悉任何其他游戏工作FPS。 在大多数游戏中,FPS可以改变,就像你想要的(通常是基于该系统如何运行的应用程序),但游戏总是以相同的速度运行(如移动在屏幕100个像素将需要1秒无事多少帧在第二个发生过)。

我能想到得到它的工作就是我想要的唯一的办法就是抓住当前的FPS每一帧,并因素是进入每一个动作或基于时间的事件的计算。 但是,这似乎是不必要的复杂,我想知道如果我完全缺少的pygame的功能的一部分数字,为我。

Answer 1:

游戏使用固定时间步长为物理,同时允许视频时步(fps)的变化。 这意味着你的update(delta)函数被调用以恒定的delta值。 这将保持稳定。

这意味着,在实践中, update可能最终会被要求每单平均通话多次draw()这取决于有多少时间的流逝。

有关详细信息,请参阅: 灯光师的“修复你的时间步长”

较大的(蟒)的例子是在食谱:ConstantGametime



Answer 2:

虽然@猴子的答案是完全datadump,你应该看看在对pygame的文档time.Clock一次。 可选的帧率参数Clock.tick()设定了FPS,而不是一个固定的FPS上限; 换句话说,如果你的游戏循环时间超过的时间来完成这一数额越长,游戏会如果你假设通过该值可以确保一个固定的游戏速度滞后。 它看起来像Clock.get_time()Clock.get_raw_time()是用来获取最后的游戏循环的执行时间的事情,那么你就可以计算出从你的游戏元素的行为。



Answer 3:

您可以定义对象的速度像素/秒,然后用返回值从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))


Answer 4:

如果你想在一个固定的速度在每一个FPS移动对象,你可以指示的速度不具有绝对价值,但相对于移动的值在第二个做,然后除以每秒的帧数。

例如,如果你希望你的对象以每帧2个像素的速度移动,让我们在30 FPS说,你要这样的速度是一样的,在每一个FPS,你可以指出它的像素移动在第二,这将是60在游戏循环,当你需要更新的速度,你会使用这个速度FPS划分,从而导致在每一帧更新中使用的相对速度。 这样一来,在30 FPS,你会得到每帧2像素的运动,而在60 FPS,你会得到一个1个像素的运动,但在1秒钟后,你将有像素的运动,这是60的相同。



文章来源: In Pygame, normalizing game-speed across different fps values
标签: python pygame