• Home
  • |
  • Blog
  • |
  • PyGame Tutorial #2 – Auf PyGame Events wie user-Input reagieren

PyGame Tutorial #2 – Auf PyGame Events wie user-Input reagieren

Zuletzt aktualisiert: Juni 29, 2023

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:

Unsere Main-Loop in PyGame

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:

Eine Übersicht der PyGame Events

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.

Das KEYDOWN Event und seine Attribute

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.

PyGame Events - jeden Frame möchten wir jedes einzelne Event abfangen

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:

pygame.event.get()

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:

Wir überprüfen die PyGame Events, um zu sehen, ob das aktuelle Event vom Typ pygame.QUIT ist

“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:

Wir setzen running auf False

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.

Das KEYDOWN Event und seine Attribute

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“.

Wenn die Escape-Taste gedrückt wird, setzen wir 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.