我正在寻找使用pygame.time.Clock()
在Python中编写一个更好的游戏循环的方法,并且我了解了保留时间和将渲染与主游戏循环分离的概念,以便更好地利用刻度线。我也了解将时间滞后传递到渲染中,以便渲染正确的运动量,但是我发现的唯一示例是用C#编写的,尽管我最初认为转换为Python相当简单,但是却没有表现。 / p>
我发现Pygame的Clock()
已经计算出最近两次对.tick的调用之间的毫秒数,并且我尝试调整发现的示例代码,但是我确实需要查看工作原理用Python编写的示例。到目前为止,这是我想出的:
FPS = 60
MS_PER_UPDATE = 1000 / FPS
lag = 0.0
clock = pygame.time.Clock()
running = True
# Do an initial tick so the loop has 2 previous ticks.
clock.tick(FPS)
while running:
clock.tick(FPS)
lag += clock.get_time()
user_input()
while lag >= MS_PER_UPDATE:
update()
lag -= MS_PER_UPDATE
render(lag / MS_PER_UPDATE)
我不确定在Pygame中这是否值得,还是已经在某些time
函数中使用了它?我的游戏在笔记本电脑上的运行速度较慢(预期),但我认为这样做可能会导致解耦渲染,从而使主PC和笔记本电脑之间的FPS有所不同。有没有人有在Pygame中进行这些高级游戏循环的经验?我只是希望它尽可能的好...
答案 0 :(得分:1)
只需花费渲染最后一帧所花费的时间(称为增量时间)并将其传递给您的游戏对象,以便他们可以决定要做什么(例如,多多少少移动)。
这是一个非常简单的示例:
import pygame
class Actor(pygame.sprite.Sprite):
def __init__(self, *args):
super().__init__(*args)
self.image = pygame.Surface((32, 32))
self.rect = pygame.display.get_surface().get_rect()
self.image.fill(pygame.Color('dodgerblue'))
def update(self, events, dt):
self.rect.move_ip((1 * dt / 5, 2 * dt / 5))
if self.rect.x > 500: self.rect.x = 0
if self.rect.y > 500: self.rect.y = 0
def main():
pygame.init()
screen = pygame.display.set_mode((500, 500))
sprites = pygame.sprite.Group()
Actor(sprites)
clock = pygame.time.Clock()
dt = 0
while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return
sprites.update(events, dt)
screen.fill((30, 30, 30))
sprites.draw(screen)
pygame.display.update()
dt = clock.tick(60)
if __name__ == '__main__':
main()
如果您的游戏速度降至60(或更低)FPS以下,dt
会变大,Actor
会移动得更多,以弥补损失的时间。