Eine äußerst wichtige Rolle in der Spieleentwicklung spielen in PyGame Events. In einem Spiel treten immer wieder unterschiedliche Ereignisse auf, auf die wir als Entwickler reagieren müssen. Beispielsweise kann der Benutzer Eingaben über die Tastatur tätigen, die Maus könnte bewegt werden oder die Bildschirmgröße sich ändern.
Als Entwickler ist es unser Ziel, auf solche Events zu reagieren. Wie das funktioniert, wirst du in diesem Beitrag lernen.
Inhaltsverzeichnis
1. Rückblick auf die Main-Loop
Wir haben im letzten Beitrag bereits die folgende Main-Loop implementiert:
Diese Schleife wird ausgeführt, solange der Wert von "running" gleich "True" ist. Innerhalb dieser Schleife haben wir auch unsere Event-Loop implementiert. Im Grunde genommen sagen wir in diesem Code:
"Solange das Spiel läuft und "running" "True" ist, führe für jeden Durchlauf und jeden Frame unseres Spiels die Event-Loop aus. Überprüfe also jedes Event, das von der Funktion pygame.event.get() zurückgegeben wird. Und bei jedem Durchlauf prüfen wir bereits, ob das aktuelle Event vom Typ pygame.QUIT ist. Wenn dies der Fall ist, setzen wir den Wert von "running" auf "False".
2. Eine Übersicht der PyGame Events
Neben dem QUIT-Event gibt es in Python natürlich noch viele weitere Arten von Events, auf die wir reagieren können. In den kommenden Absätzen werde ich genauer darauf eingehen, wie wir solche Events abfragen und entsprechend darauf reagieren. Man bezeichnet das Ganze im Übrigen auch als Event-Handling.
Auf der folgenden Abbildung siehst du eine Liste von verschiedenen Events, die in PyGame verfügbar sind:
Diese Liste habe ich aus der offiziellen PyGame-Dokumentation entnommen.
Wie du sehen kannst, hat jedes Event einen Namen. In diesem Fall haben wir zum Beispiel das QUIT-Event ganz oben in der Liste.
Die meisten Events besitzen darüber hinaus spezielle Attribute.
Das QUIT-Event hat beispielsweise den Wert "none", was bedeutet, dass es keine spezifischen Attribute besitzt. Doch wenn wir uns das KEYDOWN-Event in der dritten Zeile anschauen, finden wir bereits verschiedene Attribute, die uns mehr über dieses Event verraten.
Bei "KEYDOWN" sehen wir beispielsweise das Attribut „key“, das uns verrät, welche Taste gedrückt wurde. Außerdem können wir den Scancode auslesen.
Nun möchte ich dir zeigen, wie du nicht nur auf das QUIT-Event reagieren kannst, sondern auch auf andere Events.
Ich werde die Event-Loop noch einmal entfernen und sie schrittweise neu aufbauen, sodass du jeden Prozess genau verfolgen kannst, während ich ihn erkläre.
3. Die Event-Loop Schritt für Schritt erklärt
In jedem Durchlauf führt das Programm den Code „running“ aus. Wir haben dabei jedes Mal einen neuen Frame. Jeden Frame möchten wir jedes einzelne Event abfangen, das während dieses Frames auftritt.
Dazu verwenden wir eine for-Schleife, in der wir jedes Event durchlaufen, das uns von pygame.event.get() zurückgegeben wird. pygame.event.get() gibt uns jedes Event als Liste zurück, das während dieses Frames auftritt:
Jetzt können wir jedes einzelne Event durchgehen und überprüfen, von welchem Typ dieses jeweils ist. Wenn wir beispielsweise prüfen möchten, ob das aktuelle Event vom Typ pygame.QUIT ist, also ob es sich um ein QUIT-Event handelt, verwenden wir einfach folgenden Code:
“type” enthält den Event-Typ, um den es sich hierbei handelt. Wenn dieser pygame.QUIT ist, dann können wir entsprechend darauf reagieren und beispielsweise „running“ auf „False“ setzen:
Indem wir die Loop abbrechen und pygame.QUIT aufrufen, schließen wir auch schon dieses Fenster.
Natürlich können wir aber auch noch auf andere Events reagieren. Das funktioniert folgendermaßen:
Wenn das Event nicht vom Typ pygame.QUIT ist, schreiben wir beispielsweise die folgende Zeile:
elif event.type == pygame.KEYDOWN
Mit diesem Event können wir prüfen, ob eine Taste auf der Tastatur gedrückt wurde. Wenn dem so ist, setzen wir die Zeile folgendermaßen fort:
elif event.type == pygame.KEYDOWN and event.key
“key” ist ein Attribut des KEYDOWN-Events, wie wir noch einmal auf der folgenden Abbildung erkennen können.
Rechts neben dem KEYDOWN-Event sind dessen Attribute aufgelistet. Darunter fällt auch das key-Attribut. Wir können die Zeile also beispielsweise fortführen, indem wir abfragen, ob es sich bei diesem Attribut um den K_ESCAPE, also die Escape-Taste handelt. Wenn dem so ist, setzen wir die Variable „running“ auf „False“.
Drücken wir nun die Escape-Taste, nachdem wir das Spiel gestartet haben, schließt sich das Spielfenster wieder. Auf diese Weise fangen wir in PyGame also mit der Event-Loop Events ab.
4. Zusammenfassung
Wir können immer den Event-Typ prüfen und entsprechend darauf reagieren. Außerdem ist es möglich, anschließend noch auf einzelne Attribute einzugehen. Wie im obigen Beispiel des KEYDOWN-Events:
Wenn das KEYDOWN-Event
stattfindet, prüfen wir, ob die Escape-Taste gedrückt wurde, was wir im Code mit „K_ESCAPE“ formulieren. Das PyGame-Modul stellt verschiedene Konstanten für Keys bereit, die immer mit „K_“ beginnen.
So funktioniert also Event Handling in PyGame! Im nächsten Artikel wirst du lernen, wie man in PyGame einfache Formen zeichnen kann.
Übrigens:
Wenn du die Programmiersprache Python umfangreich lernen möchtest, dann schau dir auf jeden Fall mal unsere großen Python-Kurse in Programmieren Starten Premium an.