2017-01-31 3 views
0

Ich habe diese Funktion für einen Tod Bildschirm eines Spiels, das ich erstelle.Verzögerung innerhalb einer While-Schleife (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) 

Ich mag diese Funktion durch die Anzeige des „deadText“ Variable arbeiten, und dann 5 Sekunden warten, bevor der Bildschirm gelöscht wird und ein anderer Teil des Textes angezeigt werden, wenn der Benutzer in der Lage sein wird, ihren Namen einzugeben. Der Code funktionierte zunächst mit der Anzeige der "deadText" -Variable, aber seit ich den Zeitschlaf hinzugefügt habe, stürzt das Programm einfach ab, ohne dass es überhaupt eine Fehlermeldung gibt.

Ich würde gerne wissen, wie man eine Verzögerung von 5 Sekunden bekommen und dann den Bildschirm löschen, so dass U in der Lage sein wird, neuen Text anzuzeigen.

Antwort

0

Da Sie pygame verwenden, sollten Sie

pygame.time.wait(5000) 

anstelle von

time.sleep(5) 

Hinweis, dass anstelle von Sekunden benötigt Millisekunden warten!

+0

Dieser stürzt nicht mehr ab, mein Programm aber der erste Textblock wird nicht angezeigt. – Callum

+0

@Callum - Das ist ein anderes Thema, für das Sie eine neue Frage komplett mit dem, was Sie versucht und recherchiert haben, fragen sollten, wenn diese Antwort geholfen * lösen * dieses Problem, sollten Sie es akzeptieren – Sayse

+0

@Sayse tatsächlich, fragte ich, wie bekomme eine Verzögerung von 5 Sekunden, nachdem mein erster Textblock angezeigt wurde und diese Lösung meinen ersten Textblock nicht mehr anzeigt. – Callum

2

Sie sollten (fast) nie die Ausführung Ihres Spiels mit time.sleep oder pygame.time.wait pausieren, da es (fast) immer falsch ist, etwas zu tun.

Was passiert in Ihrem Code ist, dass Sie pygame sagen, um den Text auf der Bildschirmoberfläche zu rendern, und warten Sie dann einige Zeit.

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

Das erste Problem ist, dass pygame sagt die Bildschirmoberfläche zu verändern nicht tatsächlich etwas auf dem Bildschirm ändern. Jedes Ergebnis wird nur sichtbar sein nach Sie sagen Pygame, um den Bildschirm tatsächlich mit pygame.display.flip (oder pg.display.flip() in Ihrem Fall) zu aktualisieren.


Das zweite Problem ist, dass, während das Spiel wartet (mit zum Beispiel time.sleep), alles stoppt. Wenn Sie also 5 Sekunden warten, kann der Benutzer z. Schließen Sie das Fenster während dieser Zeit, da Ereignisse nicht verarbeitet werden. Dies kann für eine einfache Szene, die nur Text anzeigt, OK sein, aber Sie werden große Kopfschmerzen haben, wenn Sie sich dessen nicht bewusst sind. Sie können entweder das Ereignissystem von pygame verwenden (ein Beispiel ist here), einen Timer verwenden, um die Zeit kontinuierlich zu überprüfen oder sogar Frames zu zählen.

Eine andere Sache ist, dass Sie wahrscheinlich Ihre verschiedenen Szenen in acutal Szenen organisieren sollten, vielleicht werfen Sie einen Blick here für ein Beispiel.

1

Mit sleep(5) oder time.wait(5000) können Sie Fenster in dieser Zeit nicht schließen, da Ereignisse nicht überprüft werden.

Sie können pygame.time.get_ticks() verwenden, um die aktuelle Uhrzeit abzurufen und zu vergleichen, ob es sich um eine Verzögerung zum Beenden der Schleife handelt. Und es stoppt nicht Schleife.

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

Der gleiche Weg, wie Sie andere Dinge im Spiel tun können - dh. Feuer alle 2 Sekunden.


EDIT: Arbeitsbeispiel

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