pygame
Handhabung des Events
Suche…
Ereignisschleife
Pygame registriert alle Ereignisse des Benutzers in einer Ereigniswarteschlange, die mit dem Code pygame.event.get()
empfangen werden kann. Jedes Element in dieser Warteschlange ist ein Event
, und alle haben den Attributtyp, eine Ganzzahl, die type
, um welche Art von Ereignis es sich handelt. Im Pygame-Modul gibt es vordefinierte Integer-Konstanten, die den Typ darstellen. Mit Ausnahme dieses Attributs haben Ereignisse andere Attribute.
Konstanter Name | Attribute |
---|---|
VERLASSEN | keiner |
ACTIVEEVENT | Gewinn, Staat |
TASTE NACH UNTEN | Unicode, Schlüssel, mod |
KEYUP | Schlüssel, mod |
MOUSEMOTION | pos, rel, Tasten |
MOUSEBUTTONUP | Pos, Taste |
MOUSEBUTTONDOWN | Pos, Taste |
JOYAXISMOTION | Freude, Achse, Wert |
JOYBALLMOTION | freude, ball, rel |
JOYHATMOTION | Freude, Hut, Wert |
JOYBUTTONUP | Freude, Taste |
JOYBUTTONDOWN | Freude, Taste |
VIDEORISIEREN | Größe, w, h |
VIDEOEXPOSE | keiner |
USERVERSION | Code |
Beispiel
Um mit unseren Ereignissen umzugehen, durchlaufen wir einfach die Warteschlange, prüfen, um welchen Typ es sich handelt (mit Hilfe der vordefinierten Konstanten im Pygame-Modul) und führen dann eine Aktion aus. Dieser Code prüft, ob der Benutzer die Schließen-Taste in der oberen Ecke des Displays gedrückt hat, und beendet das Programm.
for event in pygame.event.get():
if event.type == pygame.QUIT:
# Close the program any way you want, or troll users who want to close your program.
raise SystemExit
ACHTUNG : Sie müssen die Ereigniswarteschlange regelmäßig aufrufen, wenn Sie Pygame verwenden! Abgesehen vom Abrufen der verfügbaren Ereignisse ist das Aufrufen der Ereigniswarteschlange auch die Möglichkeit von Pygame, intern mit dem Betriebssystem zu interagieren. Wenn die Ereigniswarteschlange nicht regelmäßig aufgerufen wird, geht Ihr Betriebssystem davon aus, dass Ihr Programm nicht mehr ordnungsgemäß funktioniert und möglicherweise den Anschein erweckt, als wäre das Programm abgestürzt (in Windows wird das Fenster weiß). Wenn Sie mit den Ereignissen nichts pygame.event.pump()
möchten, sollten Sie pygame.event.pump()
jeder Spielschleife aufrufen, damit pygame die Ereignisse intern verarbeitet.
Tastaturereignisse
Es gibt zwei Arten von Schlüsselereignissen in Pygame: KEYDOWN
und KEYUP
. Diese Ereignisse haben ein Attribut key
, die eine ganze Zahl ist eine Taste auf der Tastatur entspricht. Das Pygame-Modul hat vordefinierte Integer-Konstanten, die alle gängigen Schlüssel darstellen. Die Konstanten werden mit einem Großbuchstaben K
, einem Unterstrich und dem Namen des Schlüssels benannt. Beispiel: <- heißt K_BACKSPACE
, a heißt K_a
und F4 heißt K_F4
.
Beispiel
Dieser Code prüft, ob der Benutzer w , a , s oder d gedrückt hat.
for event in pygame.event.get():
if event.type == pygame.QUIT: # Usually wise to be able to close your program.
raise SystemExit
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_w:
print("Player moved up!")
elif event.key == pygame.K_a:
print("Player moved left!")
elif event.key == pygame.K_s:
print("Player moved down!")
elif event.key == pygame.K_d:
print("Player moved right!")
Modifikatoren
Es gibt keine Ganzzahlkonstante für Großbuchstaben. Stattdessen haben Schlüsselereignisse ein anderes Attribut namens mod
, nämlich die Modifizierer ( Umschalt , Strg , Alt usw.), die gleichzeitig als Taste gedrückt werden. Das mod
Attribut ist eine Ganzzahl, die den Modifikator darstellt, der gedrückt wird. Der ganzzahlige Wert jedes Modifikators wird im Pygame-Modul unter dem Namen KMOD_
und seinem Namen gespeichert. Beispielsweise heißt Left shift KMOD_LSHIFT
, Tab heißt KMOD_TAB
und Ctrl heißt KMOD_CTRL
.
Beispiel
Dieser Code prüft, ob der Benutzer a , Left shift + a oder Caps + a gedrückt hat.
for event in pygame.event.get():
if event.type == pygame.QUIT: # It's still wise to be able to close your program.
raise SystemExit
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
if event.mod == 0: # No modifier.
print("You pressed 'a'")
elif event.mod == pygame.KMOD_LSHIFT or event.mod == pygame.KMOD_CAPS:
print("You pressed 'A'")
else:
print("You pressed 'a' with another modifier than right shift or caps.")
Mausereignisse
In Pygame MOUSEMOTION
, MOUSEBUTTONDOWN
und MOUSEBUTTONUP
gibt es drei Arten von MOUSEBUTTONUP
. Pygame registriert diese Ereignisse, wenn ein Anzeigemodus eingestellt wurde.
MOUSEMOTION
wird empfangen, wenn der Benutzer seine Maus im Display bewegt. Es hat die Attribute buttons
, pos
und rel
.
-
buttons
ist ein Tupel, das angibt, ob die Maustasten (left
,mouse-wheel
,right
) gedrückt werden oder nicht. -
pos
ist die absolute Position (x
,y
) des Cursors in Pixel. -
rel
ist die Position relativ zur vorherigen Position (rel_x
,rel_y
) in Pixel.
MOUSEBUTTONDOWN
und MOUSEBUTTONUP
werden empfangen, wenn der Benutzer eine Maustaste drückt oder loslässt. Sie haben die Attribute button
und pos
.
-
button
ist eine ganze Zahl, die die gedrückte Taste darstellt.1
für die linke Taste, 2 für das Mausrad und3
für die rechte Taste. -
pos
ist die absolute Position der Maus (x
,y
), wenn der Benutzer die Maustaste drückt.
Beispiel
Hier ein kurzes Beispiel mit einigen Attributen jedes Mausereignisses:
for event in pygame.event.get():
if event.type == pygame.QUIT: # Close your program if the user wants to quit.
raise SystemExit
elif event.type == pygame.MOUSEMOTION:
if event.rel[0] > 0: # 'rel' is a tuple (x, y). 'rel[0]' is the x-value.
print("You're moving the mouse to the right")
elif event.rel[1] > 0: # pygame start y=0 at the top of the display, so higher y-values are further down.
print("You're moving the mouse down")
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
print("You pressed the left mouse button")
elif event.button == 3:
print("You pressed the right mouse button")
elif event.type == pygame.MOUSEBUTTONUP:
print("You released the mouse button")
Da es im Pygame-Modul keine vordefinierten Konstanten für das Maustastenattribut gibt, sind hier die Werte für jedes:
Taste | Wert |
---|---|
Linke Maustaste | 1 |
Mausrad-Taste | 2 |
Rechte Maustaste | 3 |
Mausrad nach oben scrollen | 4 |
Mausrad nach unten scrollen | 5 |
Durch Scrollen der Maustaste werden die Ereignisse pygame.MOUSEBUTTONDOWN
und pygame.MOUSEBUTTONUP
generiert.
Zustandsüberprüfung
Es ist möglich, Funktionen aus dem Modul pygame.key
und pygame.mouse
, um den Status der Taste und der Maus zu erhalten. Es ist jedoch nicht die empfohlene Methode, um Ereignisse in Pygame zu verarbeiten, da einige Mängel vorhanden sind:
Sie erhalten die Zustände, wenn die Funktion aufgerufen wird. Dies bedeutet, dass Sie Ereignisse zwischen Anrufen verpassen, wenn der Benutzer die Tasten schnell drückt.
Sie können die Reihenfolge der Ereignisse nicht bestimmen.
Sie müssen weiterhin eine der Ereignisfunktionen von pygame aufrufen, damit pygame intern mit dem Betriebssystem interagiert. Andernfalls wird gewarnt, dass das Programm nicht mehr reagiert. Die Funktionen, die Sie aufrufen können, sind:
-
pygame.event.get()
, um alle Ereignisse oder Ereignistypen (durch Übergeben der Typen als Argument) aus der Warteschlangepygame.event.get()
. -
pygame.event.poll()
, um ein einzelnes Ereignis aus der Warteschlange zu erhalten. -
pygame.event.wait()
, um auf ein einzelnes Ereignis aus der Warteschlange zu warten. -
pygame.event.clear()
, um alle Ereignisse in der Warteschlange zu löschen. -
pygame.event.pump()
, damit pygame interne Aktionen ausführen kann (wird von den oben genannten Funktionen implizit aufgerufen).
-
Tastaturereignisse
Das Schlüsselmodul hat eine Funktion pygame.key.get_pressed()
die eine Liste des Status aller Schlüssel zurückgibt. Die Liste enthält 0
für alle Tasten, die nicht gedrückt werden, und 1
für alle Tasten, die gedrückt werden. Ihr Index in der Liste wird durch Konstanten im Pygame-Modul definiert, denen alle K_
und der Schlüsselname vorangestellt sind.
pygame.event.pump() # Allow pygame to handle internal actions.
key = pygame.key.get_pressed()
if key[pygame.K_a]:
print("You pressed 'a'")
if key[pygame.K_F1]:
print("You pressed 'F1'")
if key[pygame.K_LSHIFT]:
print("You pressed 'left shift'")
if key[pygame.K_q]: # Press 'q' to exit the program
quit()
Wenn Sie prüfen möchten, ob ein Tastendruck erfolgt, statt ob die Taste gedrückt gehalten wird, können Sie den vorherigen Status aller Tasten in einer temporären Variablen speichern und prüfen, ob sich der Wert ändert:
pygame.event.pump() # Allow pygame to handle internal actions.
key = pygame.key.get_pressed()
if key[pygame.K_q] and not previous_key[pygame.K_q]:
print("You pressed 'q'")
if key[pygame.K_p] and not previous_key[pygame.K_p]:
print("You pressed 'p'")
previous_key = key
Die Anweisung wird nur dann als wahr ausgewertet, wenn die aktuelle Taste gedrückt wird und die vorherige Taste nicht gedrückt wird. Um zu überprüfen, ob der Benutzer den Schlüssel freigegeben hat, müssen Sie nur das Schlüsselwort not
( if not key[pygame.K_q] and previous_key[pygame.K_q]
) if not key[pygame.K_q] and previous_key[pygame.K_q]
. Damit dies ordnungsgemäß funktioniert, müssen Sie vor der Spielschleife die Variable previous_key = pygame.key.get_pressed()
, andernfalls erhalten Sie einen NameError
.
Mausereignisse
Das Mausmodul verfügt über Funktionen, mit denen wir die Position der Maus sowie die gedrückten Tasten überprüfen und einstellen können. Die Funktion pygame.mouse.get_pressed()
gibt ein Tupel-Tupel zurück, das pygame.mouse.get_pressed()
ob die Maustasten (links, Mausrad, rechts) gedrückt werden oder nicht.
pygame.event.pump() # Allow pygame to handle internal actions.
mouse_pos = pygame.mouse.get_pos()
mouse_buttons = pygame.mouse.get_pressed()
if mouse_pos[0] > 100:
pygame.mouse.set_pos(10, mouse_pos[1]) # Reset the mouse's x-position to 10.
print("YOU SHALL NOT PASS!")
if mouse_buttons[2]:
print("I'm right, right?")
if mouse_buttons[0]: # Press left mouse button to exit.
print("Program left")
quit()