2017-01-31 9 views
0

У меня есть эта функция для экрана смерти в игре, которую я создаю.Задержка внутри цикла while (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 мог отображать новый текст.

ответ

0

Поскольку вы используете pygame вы должны использовать

pygame.time.wait(5000) 

вместо

time.sleep(5) 

Обратите внимание, что ждать требует миллисекунды вместо секунд!

+0

Это больше не падает мою программу, но не отображается первый блок текста. – Callum

+0

@Callum - Это другая проблема, за которую вы должны задать новый вопрос в соответствии с тем, что вы пробовали и исследовали, если этот ответ помог решить эту проблему, вы должны рассмотреть возможность ее принятия. – Sayse

+0

@ На самом деле, я спросил, как получить 5-секундную задержку после отображения первого блока текста, и это решение больше не отображает мой первый блок текста. – Callum

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), использовать таймер, чтобы постоянно проверять время или даже считать кадры.

Другое дело, что вы, вероятно, должны организовать свои разные сцены в acutal сцены, возможно, посмотрите на пример here.

1

Используя 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 секунды.


EDIT: рабочий пример

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() 

 Смежные вопросы

  • Нет связанных вопросов^_^