pygame更新不一致



我正在尝试编写一个简单的pygame程序,其中一些框在屏幕上移动。我以这个例子为例。

本教程的结构如下:

class Box(pygame.sprite.Sprite):
...
    def update(self, currtime):
        if self.next_update_time < current_time:
           print time.time() # I added this to debug
           # Do some stuff
           self.next_update_time = current_time + 10
box = Box()
while True:
    pygame.time.delay(10)
    time = pygame.time.get_ticks()
    box.update(time)

我的箱子移动起来,但不是很顺利。它们会加速和减速。当我绘制更新发生的点时,我得到了这个。

这看起来像是我下面教程中提出的设计问题吗?我的硬件有问题吗?

编辑:根据Radomir Dopieralski的回答,更好的方法是:

class Box(pygame.sprite.Sprite):
...
    def update(self):
           # Do some stuff
box = Box()
clock = pygame.time.Clock()
while True:
    clock.tick(100)
    box.update()

问题是pygame.time.delay(10)将始终等待相同的时间,无论你在游戏循环中绘制方框和其他事情需要多长时间。所以等待的总时间是10+render_time

幸运的是,PyGame提供了一个解决方案:pygame.time.Clock类和它的.tick(framerate)方法,它会记住上次使用它的时间,并根据它等待较小或较大的时间,以保持帧速率不变。

我认为您需要使用pygame.time提供的时钟对象:

c = pygame.time.Clock()
while True:
    dt = c.tick(framerate) # 0 for framerate removes the cap
    ...
    ex_box.update(dt)

更新方法如下:

def update(self, miliseconds_passed):
    self.pos[0] += self.spped[0] * dt # Speed must be in pixels_per_millisecond
    self.pos[1] += self.spped[1] * dt

注:

如果你想让速度以像素每秒为单位,你必须做"*dt/1000",而不是"*dt"。

如果你想让速度以m/s为单位,如果必须设置一个常数"每米像素",并将速度乘以dt/1000。*ppm

最新更新