2012-04-12 5 views
3

Im Prinzip habe ich eine Schleife (tick, set_caption, screen_fill, event.get(), send_frame_event, flip, Wiederholung)Warum friert Pygame bei pygame.event.get() ein, wenn Sie das Fenster verschieben/ziehen?

Wenn ich aus dem Fenster um auf Windows 7 ziehen, die Schleife stoppt Looping, landete ich hochnäsig in pygame.event.get(), Ich habe versucht, bestimmte Ereignisse nur für get zB zu definieren get ([pygame.QUIT]) vergeblich.

Einfaches Aufrufen von pygame.event.clear() hat den gleichen Freeze-Effekt beim Ziehen/Verschieben des Fensters.

Gibt es eine Problemumgehung?

Nicht vollständiger Code, sollte aber genug sein:

def start(self): 
    self.running = True 
    Clock = pygame.time.Clock() 
    while self.running: 
     self.p += 25 
     tickFPS = Clock.tick(self.fps) 
     pygame.display.set_caption("Press Esc to quit. FPS: %.2f" % (Clock.get_fps())) 
     self.screen.fill([self.p&0xFF,(255-self.p)&0xFF,255]) 
     self.handleEvents() 
     self.raiseEvent("updateFrame") 
     pygame.display.flip() 
def handleEvents(self): 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      self.running = False 
     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_ESCAPE: 
       self.running = False 

vollständiger Code an: http://pastie.org/private/wm5vqq3f7xe0xlffy1fq

+0

Es ist eine gute Praxis 'pygame.event's innerhalb einer while True Schleife im Hauptkörper zu setzen platzieren. – hjpotter92

+1

Sie sind effektiv. Und das macht keinen Unterschied. Wenn du nicht in einem anderen Thread meinst? –

Antwort

0

Keine Ahnung, ob dies oder nicht helfen:

merke ich, das Problem ist, die mit beweglichen Fenster Fenster, nicht mit der Größe des Fensters. Vielleicht gibt es eine gewisse Ähnlichkeit zwischen Verschieben und Größenanpassung?

Dann wird der Anzeigemodus eingestellt ist, mehr Ereignisse auf der pygame Ereigniswarteschlange gestellt:

ich dies in der Dokumentation wieder Sizing gefunden. pygame.QUIT wird gesendet, wenn der Benutzer das Herunterfahren des Programms angefordert hat. Das Fenster empfängt pygame.ACTIVEEVENT-Ereignisse, wenn die Anzeige den Eingabefokus erhöht und verliert. Wenn die Anzeige mit dem Flag pygame.RESIZABLE festgelegt wird, werden pygame.VIDEORESIZE-Ereignisse gesendet, wenn der Benutzer die Fensterdimensionen anpasst. Hardware-Displays, die direkt auf den Bildschirm zeichnen, erhalten pygame.VIDEOEXPOSE-Ereignisse, wenn Teile des Fensters neu gezeichnet werden müssen.

und:

Beachten Sie, dass, wenn der Benutzer das Spielfenster ändert die Größe, nicht pygame nicht automatisch seine interne Siebfläche aktualisieren. Sie müssen set_mode() jedes Mal aufrufen, wenn VIDEORESIZE gesendet wird. Dies sollte in der Dokumentation deutlicher werden.

Vielleicht passiert etwas ähnliches beim Verschieben des Spielfensters?

+0

Das Problem ist, dass pygame.event.get() effektiv blockiert. –

1

versuchen, einen Anruf zu pygame.event.pump() in Ihrem mainloop (oder handleEvents Funktion)

+0

"Diese Funktion ist nicht erforderlich, wenn Ihr Programm Ereignisse in der Warteschlange konsistent über die anderen pygame.event-Funktionen verarbeitet." http://www.pygame.org/docs/ref/event.html#pygame.event.pump Ich werde es versuchen, wenn ich aus Gründen der Vollständigkeit nach Hause komme. –

+0

Deshalb habe ich "try" geschrieben - ich hatte ein unberechenbares Verhalten und Unterschiede zwischen verschiedenen Systemen, wenn ich event.pump nicht anrufe - also gewöhnte ich mich daran, immer einen Anruf zu tätigen. – jsbueno

Verwandte Themen