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 und 3 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 Warteschlange pygame.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()


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow