我正在尝试编写一个简单的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