10

While I've been using time.wait in my code since I began learning Python and Pygame, I've been wondering if there are any other ways to do it and what are the advantages and disadvantages of each approach. For example, Pygame also has a pygame.time.wait. What's the difference between python's wait and pygame's wait functions? Which one is better? And are there other ways to wait some time besides using these two functions?

4

3 回答 3

17

对于动画/冷却等:如果您想“等待”,但仍有代码在运行,请使用: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()
于 2013-09-17T17:39:47.970 回答
5

一般来说,对于 Python,您将需要查看sleep库。

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

于 2013-09-17T00:08:20.447 回答
2

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

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

pygame.event.pump()此外,在显示更新在窗口中可见之前,您必须使用 处理事件。见pygame.event.pump()

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

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

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

另请参阅为什么 PyGame 在延迟或睡眠之前不在窗口中绘制?


在任何情况下,这都不是典型应用程序中等待或延迟某事的方式。等待时游戏没有响应。用来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()

另请参阅如何一次停止超过 1 发子弹?


最小的例子: 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()
于 2020-11-05T16:47:11.660 回答