我有这个功能用于我正在创建的游戏的死亡屏幕。
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能够显示新文本。
答案 0 :(得分:2)
您应该(几乎)永远不会暂停使用time.sleep
或pygame.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)
请注意,等待需要毫秒而不是秒!