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命令完成后执行。那我们为什么要等呢?