2017-01-31 28 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秒の遅延を取得してから画面を消去する方法を知りたいと思います。あなたがpygameを使用しているので

答えて

0

あなたの代わりに秒のミリ秒を必要と待っ

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.display.flip(またはあなたの場合はpg.display.flip())に更新するようにpygameに指示します。


第二の問題は、ゲームが、(例えばtime.sleepで)停止しすべてを待っている間ということです。 5秒待っていると、ユーザーはできません。イベントが処理されないため、この時間中にウィンドウを閉じます。これはテキストだけを表示するシンプルなシーンでは問題ありませんが、これを認識していなければ大きな頭痛に冒されます。あなたは、pygameのイベントシステム(例:here)を使用するか、タイマを使用して時間を連続的にチェックしたり、フレームをカウントしたりすることができます。

もう一つは、あなたはおそらく、多分、たとえば見hereを取る、acutal シーンにあなたのさまざまなシーンを整理しなければならないことです。

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() 
関連する問題