while循环中的延迟(Python/Pygame)
我有这个功能,用于我正在创建的游戏的死亡屏幕while循环中的延迟(Python/Pygame),python,pygame,Python,Pygame,我有这个功能,用于我正在创建的游戏的死亡屏幕 def deathScreen(): deathScreen = True while deathScreen == True: screen.fill(black) for event in pg.event.get(): if event.type == pg.QUIT: quitGame() deadText = titleF
def deathScreen():
deathScreen = True
while deathScreen == True:
screen.fill(black)
for event in pg.event.get():
if event.type == pg.QUIT:
quitGame()
deadText = titleFont.render("You Died!", True, white)
screen.blit(deadText, (155,200))
time.sleep(5)
screen.fill(black)
pg.display.flip()
clock.tick(15)
我希望这个函数通过显示deadText变量来工作,然后等待5秒钟,然后屏幕被清除,并显示另一段文本,用户可以在其中输入他们的姓名。代码最初是通过显示deadText变量来工作的,但是自从我添加了时间睡眠之后,程序就崩溃了,没有任何错误消息
我想知道如何获得5秒的延迟,然后清除屏幕,以便您能够显示新文本。既然您使用的是pygame,您应该使用
pygame.time.wait(5000)
而不是
time.sleep(5)
请注意,等待需要毫秒而不是秒 既然您使用的是pygame,就应该使用
pygame.time.wait(5000)
而不是
time.sleep(5)
请注意,等待需要毫秒而不是秒 您几乎不应该在time.sleep或pygame.time.wait中暂停游戏的执行,因为这样做几乎总是错误的 代码中发生的事情是告诉pygame将文本渲染到屏幕表面,然后等待一段时间
screen.blit(deadText, (155,200))
time.sleep(5)
第一个问题是告诉pygame改变屏幕表面实际上并没有改变屏幕上的某些东西。只有在您告诉pygame实际使用pygame.display.flip或pg.display.flip更新屏幕后,才能看到任何结果
第二个问题是,当游戏等待(例如时间、睡眠)时,一切都停止了。因此,如果您等待5秒钟,用户将无法在这段时间内关闭窗口,例如,因为不会处理事件。对于只显示一些文本的简单场景来说,这可能没问题,但如果你不知道这一点,你会遇到很大的麻烦。您可以使用pygame的事件系统,例如,使用计时器持续检查时间,甚至计数帧
另一件事是,你可能应该把不同的场景组织成真实的场景,也许可以举个例子。你几乎不应该随着time.sleep或pygame.time.wait暂停游戏的执行,因为这样做几乎总是错误的 代码中发生的事情是告诉pygame将文本渲染到屏幕表面,然后等待一段时间
screen.blit(deadText, (155,200))
time.sleep(5)
第一个问题是告诉pygame改变屏幕表面实际上并没有改变屏幕上的某些东西。只有在您告诉pygame实际使用pygame.display.flip或pg.display.flip更新屏幕后,才能看到任何结果
第二个问题是,当游戏等待(例如时间、睡眠)时,一切都停止了。因此,如果您等待5秒钟,用户将无法在这段时间内关闭窗口,例如,因为不会处理事件。对于只显示一些文本的简单场景来说,这可能没问题,但如果你不知道这一点,你会遇到很大的麻烦。您可以使用pygame的事件系统,例如,使用计时器持续检查时间,甚至计数帧
另一件事是,您可能应该将不同的场景组织到实际场景中,可以举个例子。使用sleep5或time.wait5000此时无法关闭窗口,因为它不检查事件
您可以使用pygame.time.get_ticks获取当前时间,并比较是否延迟退出循环。它不会停止循环
def deathScreen():
# you can render only once
deadText = titleFont.render("You Died!", True, white)
# you can display only once
screen.fill(black)
screen.blit(deadText, (155,200))
pg.display.flip()
# calculate exit time: 5000ms = 5s
current_time = pygame.time.get_ticks()
exit_time = current_time + 5000
# - mainloop -
deathScreen = True
while deathScreen:
for event in pg.event.get():
if event.type == pg.QUIT:
quitGame()
current_time = pygame.time.get_ticks()
if current_time >= exit_time:
deathScreen = False
clock.tick(5)
# - after loop -
screen.fill(black)
pg.display.flip()
同样的方式,你可以在游戏中做其他事情-即每2秒发射子弹
编辑:工作示例
import pygame as pg
# --- constants --- (UPPER_CASE names)
WHITE = (255, 255, 255)
BLACK = ( 0, 0, 0)
RED = (255, 0, 0)
GREEN = ( 0, 255, 0)
BLUE = ( 0, 0, 255)
# --- functions --- (lower_case names)
def message(text, delay=5000, foreground=WHITE, background=BLACK):
image = font.render(text, True, foreground)
rect = image.get_rect()
rect.center = screen.get_rect().center
screen.fill(background)
screen.blit(image, rect)
pg.display.flip()
current_time = pg.time.get_ticks()
exit_time = current_time + delay
clock = pg.time.Clock()
running = True
while running:
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
quit()
if event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE:
running = False
current_time = pg.time.get_ticks()
if current_time >= exit_time:
running = False
clock.tick(5)
# --- main --- (lower_case names)
pg.init()
screen = pg.display.set_mode((800, 600))
screen_rect = screen.get_rect()
font = pg.font.Font(None, 40)
message("Wait 2 seconds or press ESC", 2000, BLACK, RED)
message("You Died!", 2000)
message("Good Bye!", 2000, BLACK, GREEN)
pg.quit()
quit()
使用sleep5或time.wait5000,此时无法关闭窗口,因为它不检查事件
您可以使用pygame.time.get_ticks获取当前时间,并比较是否延迟退出循环。它不会停止循环
def deathScreen():
# you can render only once
deadText = titleFont.render("You Died!", True, white)
# you can display only once
screen.fill(black)
screen.blit(deadText, (155,200))
pg.display.flip()
# calculate exit time: 5000ms = 5s
current_time = pygame.time.get_ticks()
exit_time = current_time + 5000
# - mainloop -
deathScreen = True
while deathScreen:
for event in pg.event.get():
if event.type == pg.QUIT:
quitGame()
current_time = pygame.time.get_ticks()
if current_time >= exit_time:
deathScreen = False
clock.tick(5)
# - after loop -
screen.fill(black)
pg.display.flip()
同样的方式,你可以在游戏中做其他事情-即每2秒发射子弹
编辑:工作示例
import pygame as pg
# --- constants --- (UPPER_CASE names)
WHITE = (255, 255, 255)
BLACK = ( 0, 0, 0)
RED = (255, 0, 0)
GREEN = ( 0, 255, 0)
BLUE = ( 0, 0, 255)
# --- functions --- (lower_case names)
def message(text, delay=5000, foreground=WHITE, background=BLACK):
image = font.render(text, True, foreground)
rect = image.get_rect()
rect.center = screen.get_rect().center
screen.fill(background)
screen.blit(image, rect)
pg.display.flip()
current_time = pg.time.get_ticks()
exit_time = current_time + delay
clock = pg.time.Clock()
running = True
while running:
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
quit()
if event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE:
running = False
current_time = pg.time.get_ticks()
if current_time >= exit_time:
running = False
clock.tick(5)
# --- main --- (lower_case names)
pg.init()
screen = pg.display.set_mode((800, 600))
screen_rect = screen.get_rect()
font = pg.font.Font(None, 40)
message("Wait 2 seconds or press ESC", 2000, BLACK, RED)
message("You Died!", 2000)
message("Good Bye!", 2000, BLACK, GREEN)
pg.quit()
quit()
这不再崩溃了我的程序,但第一个文本块没有显示。@卡拉姆-这是一个不同的问题,你应该问一个新的问题完成你所尝试和研究,如果这个答案有助于解决这个问题,你应该考虑接受。it@Sayse事实上我问如何在显示我的第一个文本块后获得5秒的延迟,而此解决方案不再显示我的第一个文本块。@koalo我已经计算出来了,time.wait以毫秒为单位,谢谢。用pygame.time.wait代替time.sleep的好处是什么?这不会使我的程序崩溃,但不会显示第一块文本。@Callum-这是一个不同的问题,你应该问一个新问题,包括你尝试和研究的内容,如果这个答案有助于解决这个问题,你应该考虑接受。it@Sayse事实上,我问过如何在显示我的第一个文本块后获得5秒的延迟,而此解决方案不再显示我的第一个文本块。@koalo我已经解决了,time.wait以毫秒为单位,谢谢。使用pygame的好处是什么
.时间.等一下而不是时间.睡觉?我有个问题。为什么我们需要在循环中等待或延迟之类的事情?我是说;通常,每个下一个命令仅在before命令完成后执行。那我们为什么要等?我有个问题。为什么我们需要在循环中等待或延迟之类的事情?我是说;通常,每个下一个命令仅在before命令完成后执行。那我们为什么要等呢?