2012-03-01 39 views
1

我想写一个简单的pygame程序,其中一些框在屏幕上移动。我正在关注this examplepygame不一致更新

本教程的结构如下:

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) 

我的箱子移动,但不是非常顺利。他们加快速度并放慢一点点。当我绘制更新发生的点时,我得到this

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

编辑: 基于拉多米尔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() 
+0

我刚刚注意到教程中有一个'pygame.time.delay(10)',所以这是一个愚蠢的问题。 – ajwood 2012-03-01 02:59:58

+0

问题实际上仍然存在,只是没有像添加延迟之前那样糟糕。当我将延迟/更新降低到5时,它*非常糟糕。所以我认为这是一个有效的问题。 – ajwood 2012-03-01 03:05:49

+0

+1为图 – Darthfett 2012-03-14 21:00:59

回答

2

的事情是,pygame.time.delay(10)会一直等在同一时间,无论多长的箱子和其他东西的绘图你在游戏循环中做了。所以等待的总时间是10+render_time

幸运的是,pygame的带有一个解决这样的:pygame.time.Clock类和它的.tick(framerate)方法,该方法还记得当上次使用的时间,并等待根据其时间的更小或更大的量,以保持帧速率常数。

+0

我不清楚如何使用pygame.time.Clock.tick在我的例子中。 – ajwood 2012-03-02 01:18:08

1

我认为你需要使用时钟对象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