如何在不休眠整个程序的情况下在一个函数中休眠

ban*_*ana 2 python pygame

所以我正在尝试制作一个游戏,在这个游戏中我调用了一个我想慢慢执行的函数,但是当我使用“time.sleep(x)”时,它会暂停文件中的所有内容,而不是仅仅暂停进程功能。我正在尝试为 2-d 游戏添加跳跃功能,所以如果有更好的方法来做到这一点,那么我将不胜感激任何建议,但这只是我对这款游戏的第一个想法。

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)
Run Code Online (Sandbox Code Playgroud)

所以我有了它,所以当我跳跃时,它会给我一个缓慢的跳跃,而不是仅仅传送,但就像我说的,它在跳跃时暂停一切。

Kin*_*ley 5

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

解决这个问题的一个简单方法是使用 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)
Run Code Online (Sandbox Code Playgroud)

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

MOVE_DINO_EVENT = pygame.USEREVENT + 1

[...]

pygame.time.set_timer( MOVE_DINO_EVENT, DINO_UPDATE_DELAY )
Run Code Online (Sandbox Code Playgroud)

编辑:更深入的解释。

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

现在,您先绘制恐龙,然后sleep()再移动并再次绘制。当它到达跳跃的最高点时,您等待 250 毫秒,然后重复前一阶段的向下跳跃。

所以使用的问题sleep()是它会阻止整个程序(包括事件循环,这可能会导致不好的事情发生)。

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

整个想法是继续查看时钟,使用时间作为下一步绘制内容/位置的仲裁者,而不是多次调用sleep().