自从我开始学习Python和Pygame以来,我一直在我的代码中使用 time.wait ,我一直想知道是否有其他方法可以做到这一点以及有什么优势和每种方法的缺点。例如,Pygame还有一个 pygame.time.wait 。 python的wait和pygame的等待函数有什么区别?哪一个更好?除了使用这两个函数之外还有其他方法可以等待一段时间吗?
答案 0 :(得分:13)
对于动画/冷却时间等:如果您想“等待”,但仍然运行代码,请使用: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()
答案 1 :(得分:1)
对于Python,一般来说,您需要查看sleep库。
对于Pygame,使用pygame.time.delay()将基于CPU时钟暂停一定的毫秒数以获得更高的准确性(与pygame.time.wait相反)。
答案 2 :(得分:0)
如果您只等待一段时间,则可以使用pygame.time.wait
或pygame.time.delay
。但是,如果要显示一条消息然后等待一段时间,则需要事先更新显示。仅在pygame.display.update()
或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()