2016-05-23 4 views
2

Ich mache ein Spiel, wo, wenn ein Spieler aus dem Bildschirm tritt, beginnt das Niveau. Ich möchte ein Bild von "LEVEL 1" vor dem Spiel zeigen, aber das Programm zeigt das Bild zu schnell. Meine Bildrate liegt bei 60.Verlangsamen Zeit, aber nicht das Programm

Ich frage mich, ob es eine Möglichkeit gibt, die Zeit für etwa 5 Sekunden während des Blittings des Bildschirms zu verzögern, aber nachdem es wieder normal läuft. Das Problem für mich mit den pygame.time.delay() und warten Sachen ist, dass das gesamte Programm verlangsamt wird.

Gibt es einen einfacheren Weg?

EDIT______ CODE

#START OF LEVEL 1 
    if level1: 

     screen.blit(level1_image,background_position) 
     pygame.time.delay(500) 
     level1yay = True 
    if level1yay: 

     screen.blit(background,background_position) 

#Flip the Display 
    pygame.display.flip() 
    clock.tick(time) 

#Quit 
pygame.quit() 

Das erste Bild wird nicht angezeigt und geht direkt auf das zweite Bild

+0

So haben Sie versuchen, das Bild zu zeigen, dann verzögert das Programm für 5 Sekunden? –

+0

Ich tat, aber es hat nicht funktioniert, es pausierte mein gesamtes Programm und das Bild aus irgendeinem Grund erscheint nie wirklich. – abc1234

+0

Könnten Sie bitte Ihre Frage bearbeiten, um [mcve] anzuzeigen? –

Antwort

1

Sie könnten einen Timer einrichten und die Zeit verfolgen. Wenn der Timer die gewünschte Verzögerung erreicht, können Sie etwas tun.

Im folgenden Beispiel habe ich den Timer eingerichtet und level1yay nur dann auf true gesetzt, wenn der Timer den Verzögerungswert erreicht hat.

Ich habe eine Bedingung canexit hinzugefügt, damit das Spiel nicht auf der ersten Schleife endet. Ich nahm an, dass die Bedingung für "if level1:" woanders festgelegt wurde.

mytimer = pygame.time.Clock() #creates timer 
time_count = 0 #will be used to keep track of the time 
mydelay = 5000 # will delay the main game by 5 seconds 
canexit = False 

#updates timer 
    mytimer.tick() 
    time_count += mytimer.get_time() 
#check if mydelay has been reached 
    if time_count >= mydelay: 
     level1yay = True 
     canexit = True 

#START OF LEVEL 1 
    if level1: 
     screen.blit(level1_image,background_position) 

    if level1yay: 
     screen.blit(background,background_position) 

#Flip the Display 
    pygame.display.flip() 
    clock.tick(time) 

#Quit 
if canexit == True: 
    pygame.quit() 

EDIT EINZUBEZIEHEN AKTIONEN vor dem Eintritt in LEVEL1:

mytimer = pygame.time.Clock() #creates timer 
time_count = 0 #will be used to keep track of the time 
mydelay = 5000 # will delay the main game by 5 seconds 
canexit = False 
start_menu = True # to start with the start menu rather than level1 

#Do something before level 1 
    if start_menu == True: 
     ... do stuff 
     if start_menu end: 
      level1 = True 
      time_count = 0 

#START OF LEVEL 1 
    if level1 == True: 
    #updates timer 
     mytimer.tick() # start's ticking the timer 
     time_count += mytimer.get_time() # add's the time since the last tick to time_count 
    #check if mydelay has been reached 
     if time_count >= mydelay: 
      level1 = False # so that you do not enter level1 again (even though this is redundant here since you will exit the game at the end of the loop... see canexit comment) 
      level1yay = True # so that you can enter level1yay 
      canexit = True # so that the game terminates at the end of the game loop 
      screen.blit(level1_image,background_position) 

    if level1yay: 
     screen.blit(background,background_position) 

#Flip the Display 
    pygame.display.flip() 
    clock.tick(time) 

#Quit 
if canexit == True: 
    pygame.quit() 
+0

Nur eine Frage. Sagen wir einfach, dass ein Spieler etwas tun muss, um zu diesem Level 1 Bildschirm zu gelangen. Wäre die Zeit dann nicht unvorhersehbar, weil du nicht weißt, wann der Spieler eintreten wird. Außerdem muss ich alle obigen Variablen vor oder nach der Schleife setzen. – abc1234

+0

Hallo, ich würde die Variablen vor die Schleife setzen, sonst werden sie jedes Mal zurückgesetzt, wenn die Spielschleife aufgerufen wird und time_count wird niemals den mydelay Wert erreichen, da time_count auf 0 zurückgesetzt wird Spiel für eine Weile (sagen Sie haben einen Menübildschirm), dann könnten Sie eine Bedingung hinzufügen, so dass, wenn der Spieler diesen Menübildschirm verlässt der time_count auf 0 zurückgesetzt wird. Da der mytimer.tick() die Zeit seit dem letzten Tick ist es sollte funktionieren. – Sorade

+0

Ich habe gerade meine Antwort bearbeitet, um Ihnen eine Idee zu geben ... Ich kann mich nicht genau erinnern, was tick und get_time() genau machen, also vielleicht, dass Sie time_count auf 0 setzen, wenn Sie das "Startmenü" verlassen ist vor Level1 getan, ist nicht einmal notwendig. Weitere Informationen finden Sie unter http://www.pygame.org/docs/ref/time.html.In meinem klassenbasierten Spiel benutze ich diese Timer für viele Dinge, wie zB den Spieler nur einmal alle 1 Sekunde angreifen zu lassen oder Sprite-Animationen zu verzögern ... Ich hatte noch keine Probleme damit. – Sorade

0

Ich weiß nicht, ob dies wirklich funktioniert, aber man könnte versuchen, das gleiche Bild Anzeigen von "LEVEL 1" mehrmals hintereinander, so scheint es länger zu bleiben, aber das Programm selbst wird nie wirklich verzögert.

+0

Ich habe das versucht, aber bei 60 Bildern pro Sekunde kann ich nicht bis zu 300 Bilder pro Sekunde aufstellen. Es würde die Geschwindigkeit aufnehmen, und es wäre chaotisch. Ich könnte eine for-Schleife machen, aber es gibt definitiv einfachere Wege. – abc1234

0

pygame.time.wait(5000) ist eine Verzögerung von 5 Sekunden, 500 ist eine halbe Sekunde. Sie haben die Variable level1 direkt vor diesem Codefragment auf True gesetzt, richtig?

+0

Ja, ich setze es auf wahr. Ich habe das versucht und es hat immer noch nicht funktioniert, Mein gesamtes Programm friert einfach ein. – abc1234