在while循环中延迟(Python / Pygame)

时间:2017-01-31 09:32:44

标签: 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 = 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秒然后清除屏幕,以便U能够显示新文本。

3 个答案:

答案 0 :(得分:2)

您应该(几乎)永远不会暂停使用time.sleeppygame.time.wait执行您的游戏,因为它(几乎)总是错误的做法。

你的代码中发生的事情是告诉pygame将文本渲染到屏幕表面,然后等待一段时间。

screen.blit(deadText, (155,200))
time.sleep(5)

第一个问题是告诉pygame改变屏幕表面 实际上不会改变屏幕上的内容。任何结果只有 后才能显示,你告诉pygame用pygame.display.flip(或你的pg.display.flip())实际更新屏幕。

第二个问题是,当游戏等待时(例如time.sleep),一切停止。因此,如果您等待5秒钟,则用户将无法例如在此期间关闭窗口,因为不会处理事件。对于只显示一些文本的简单场景,这可能没问题,但如果你不知道这一点,你会遇到很大的麻烦。你可以使用pygame的事件系统(例如here),使用计时器来连续检查时间甚至计算帧数。

另一件事是您可能应该将不同的场景组织成实际的场景,或许可以看看here作为示例。

答案 1 :(得分:2)

使用sleep(5)time.wait(5000)您无法在此时关闭窗口,因为它不会检查事件。

您可以使用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()

答案 2 :(得分:0)

由于您使用的是pygame,因此您应该使用

pygame.time.wait(5000)

而不是

time.sleep(5)

请注意,等待需要毫秒而不是秒!