如何在一个函数中休眠而不休眠整个程序

2024-06-12 03:43:28 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我尝试制作一个游戏,在这个游戏中我调用了一个我想慢慢执行的函数,但是当我使用“time.sleep(x)”时,它会暂停文件中的所有内容,而不仅仅是暂停函数的过程。我正在尝试为二维游戏添加跳跃功能,因此如果有更好的方法,我将非常感谢您的建议,但这只是我对该游戏的第一个想法

for n in range(15):
    Dino.rect.bottom -= 5
    update_screen(Dino, screen, cactus)
    time.sleep(0.01)
time.sleep(0.25)
inair = False
for n in range(15):
    Dino.rect.bottom += 5
    update_screen(Dino, screen, cactus)
    time.sleep(0.01)

所以我有它,所以当我跳的时候,它会给我一个缓慢的跳跃,而不是像我说的那样,它会在跳跃时暂停一切


Tags: 文件函数inrect游戏内容fortime
1条回答
网友
1楼 · 发布于 2024-06-12 03:43:28

这不是一个好的计时方法。正如你所说的,这会使整个程序处于休眠状态。多线程对于简单地移动精灵来说有点复杂

解决这个问题的一个简单方法是使用PyGame函数time.get_ticks(),它返回一个以毫秒为单位的不断增加的时间

使用此时间戳,记录操作的上一次时间,但在经过足够的时间之前不要再次更新

例如:

DINO_UPDATE_DELAY = 100   # milliseconds

next_dino_update = 0     # time next move due

[...]

# Move dino, if necessary
time_now = pygame.time.get_ticks()
if ( time_now > next_dino_update ):
    Dino.rect.bottom += 5
    next_dino_update = time_now + DINO_UPDATE_DELAY   # in the future

# Paint the dino, wherever it is
update_screen(Dino, screen, cactus)

也可以请求计时器在将来向事件循环发送消息

MOVE_DINO_EVENT = pygame.USEREVENT + 1

[...]

pygame.time.set_timer( MOVE_DINO_EVENT, DINO_UPDATE_DELAY )

编辑:更深入的解释

所以基本上你是在实现一个动画,就像一个动画/卡通。显示器上的东西以一定的速度移动。在上面的代码中,您似乎每隔0.01秒(10毫秒)向y + 5方向移动一个“恐龙”

现在,你画恐龙,然后sleep(),然后移动&;再画一次。当它到达跳转的最远点时,您等待250毫秒,然后重复上一阶段的向下跳转

因此,使用sleep()的问题在于它会阻塞整个程序(包括事件循环,这可能会导致糟糕的事情发生)

因此,上面的示例不需要睡眠一段时间,而只是查看PyGame时钟,以确定同一时间段是否已经过去。这允许程序知道动画是否需要更新

整个想法是继续观察时钟,利用时间作为下一步画什么/在哪里画的仲裁者,而不是多次调用sleep()

相关问题 更多 >