如何在pygame中等待一段时间?

Posted

技术标签:

【中文标题】如何在pygame中等待一段时间?【英文标题】:How to wait some time in pygame? 【发布时间】:2013-09-21 06:05:07 【问题描述】:

自从我开始学习 Python 和 Pygame 以来,我一直在我的代码中使用 time.wait,我一直想知道是否还有其他方法可以做到这一点,有什么优势和每种方法的缺点。例如,Pygame 还有一个 pygame.time.wait。 python的wait和pygame的wait函数有什么区别?哪一个更好?除了使用这两个功能之外,还有其他方法可以等待一段时间吗?

【问题讨论】:

我通常使用计时器对象,这样其余代码可以在我等待时继续运行 相关:Move an object every few seconds in Pygame 【参考方案1】:

对于一般的 Python,您需要查看 sleep 库。

但是,对于 Pygame,使用 pygame.time.delay() 将根据 CPU 时钟暂停给定的毫秒数,以提高准确性(与 pygame.time.wait 不同)。

【讨论】:

【参考方案2】:

对于动画/冷却等:如果您想“等待”,但仍有代码在运行,请使用:pygame.time.get_ticks

class Unit():
    def __init__(self):
        self.last = pygame.time.get_ticks()
        self.cooldown = 300    

    def fire(self):
        # fire gun, only if cooldown has been 0.3 seconds since last
        now = pygame.time.get_ticks()
        if now - self.last >= self.cooldown:
            self.last = now
            spawn_bullet()

【讨论】:

【参考方案3】:

如果您只是等待一段时间,您可以使用pygame.time.waitpygame.time.delay。但是,如果要显示一条消息然后等待一段时间,则需要事先更新显示。仅当 pygame.display.update()pygame.display.flip() 时,才会更新显示 叫做。见pygame.display.flip()

这将更新整个显示的内容。

您还必须使用pygame.event.pump() 处理事件,然后才能在窗口中看到显示的更新。见pygame.event.pump()

对于游戏的每一帧,您都需要对事件队列进行某种调用。这确保您的程序可以在内部与操作系统的其余部分进行交互。

这一切都意味着你必须在pygame.time.delay()pygame.time.wait()之前调用pygame.display.flip()pygame.event.pump()

screen.blit(text, (x, y))
pygame.display.flip()
pygame.event.pump()
pygame.time.delay(delay * 1000) # 1 second == 1000 milliseconds

另见Why doesn't PyGame draw in the window before the delay or sleep?


无论如何,这不是典型应用程序中等待或延迟某事的方式。等待时游戏没有响应。使用pygame.time.get_ticks()测量时间。 例如,如果您想在显示屏上显示一条消息,请获取当前时间并计算消息必须消失之后的时间点。只要当前时间低于计算的时间,就会显示消息:

message_end_time = 0
run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    # [...]

    current_time = pygame.time.get_ticks()
    if something_has_happened:
        message_surf = font.render('Important message!', True, (255, 0, 0))
        message_end_time = pygame.time.get_ticks() + 3000 # display for 3 seconds

    window.fill(0)

    # [...]

    if current_time < message_end_time:
        window.blit(message_surf, (x, y))
    pygame.display.flip()

另见How do I stop more than 1 bullet firing at once?


最小示例: repl.it/@Rabbid76/PyGame-MessageDelay

import pygame

pygame.init()
font = pygame.font.SysFont(None, 50)
text = font.render('press key or mouse', True, (255, 0, 0))

window = pygame.display.set_mode((500, 200))
clock = pygame.time.Clock()
message_end_time = pygame.time.get_ticks() + 3000

run = True
while run:
    clock.tick(60)
    current_time = pygame.time.get_ticks()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        if event.type == pygame.KEYDOWN:
            text = font.render(pygame.key.name(event.key) + ' pressed', True, (255, 0, 0))
            message_end_time = pygame.time.get_ticks() + 2000
        if event.type == pygame.MOUSEBUTTONDOWN:
            text = font.render('button ' + str(event.button) + ' pressed', True, (255, 0, 0))
            message_end_time = pygame.time.get_ticks() + 2000

    window.fill(0)
    if current_time < message_end_time:
        window.blit(text, text.get_rect(center = window.get_rect().center))
    pygame.display.flip()

pygame.quit()
exit()

【讨论】:

以上是关于如何在pygame中等待一段时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何让屏幕等待用户输入

如何在pycharm里面安装pygame

如何使用 pygame 在 Python 中保持 png 图像的透明度? [复制]

我如何在 Node.js (JavaScript) 中等待? l 需要暂停一段时间

如何让 TextWatcher 在执行某些操作之前等待一段时间

如何在等待一段时间后进行程序python [重复]