Szukaj…


Pętla zdarzeń

Pygame zarejestruje wszystkie zdarzenia od użytkownika w kolejce zdarzeń, które można odebrać za pomocą kodu pygame.event.get() . Każdy element w tej kolejce jest obiektem Event i wszystkie będą miały type atrybutu, który jest liczbą całkowitą reprezentującą rodzaj zdarzenia. W module pygame znajdują się predefiniowane stałe liczb całkowitych reprezentujące typ. Z wyjątkiem tego atrybutu zdarzenia mają różne atrybuty.

Stała nazwa Atrybuty
PORZUCIĆ Żaden
ACTIVEEVENT zysk, stan
KLUCZ Unicode, klucz, mod
KEYUP klawisz, mod
MOUSEMOTION pos, rel, przyciski
MOUSEBUTTONUP pozycja, przycisk
MOUSEBUTTONDOWN pozycja, przycisk
JOYAXISMOTION radość, oś, wartość
JOYBALLMOTION radość, piłka, rel
JOYHATMOTION radość, kapelusz, wartość
JOYBUTTONUP radość, guzik
JOYBUTTONDOWN radość, guzik
ROZMIAR WIDEO rozmiar, w, h
WIDEOEKSPOZYCJA Żaden
UŻYTKOWNIK kod

Przykład

Aby obsłużyć nasze zdarzenia, po prostu zapętlamy kolejkę, sprawdzamy, jaki to typ (za pomocą predefiniowanych stałych w module pygame), a następnie wykonujemy akcję. Ten kod sprawdzi, czy użytkownik nacisnął przycisk zamykania w górnym rogu wyświetlacza, a jeśli tak, zamknij program.

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

UWAGA : Podczas korzystania z pygame musisz regularnie wywoływać kolejkę zdarzeń! Oprócz pobierania dostępnych zdarzeń, wywołanie kolejki zdarzeń jest również sposobem pygame na wewnętrzną interakcję z systemem operacyjnym. Jeśli kolejka zdarzeń nie jest wywoływana regularnie, system operacyjny zakłada, że program nie działa już poprawnie i prawdopodobnie sprawia, że program się zawiesił (w systemie Windows okno staje się białe). Jeśli nie chcesz nic robić ze zdarzeniami, powinieneś wywołać pygame.event.pump() każdej pętli gry, aby pygame przetworzyła zdarzenia wewnętrznie.


Zdarzenia na klawiaturze

Istnieją dwa rodzaje kluczowych zdarzeń w KEYDOWN pygame: KEYDOWN i KEYUP . Te zdarzenia mają key atrybutu key który jest liczbą całkowitą reprezentującą klawisz na klawiaturze. Moduł pygame ma predefiniowane stałe liczb całkowitych reprezentujące wszystkie wspólne klucze. Stałe są nazywane wielką literą K , podkreśleniem i nazwą klucza. Na przykład <- ma nazwę K_BACKSPACE , a ma nazwę K_a a F4 - K_F4 .

Przykład

Ten kod sprawdzi, czy użytkownik nacisnął w , a , s lub d .

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!")

Modyfikatory

Nie ma stałej całkowitej dla wielkich liter. Zamiast tego kluczowe zdarzenia mają inny atrybut o nazwie mod , którym są modyfikatory ( shift , ctrl , alt itp.) Naciskane jednocześnie jako klawisz. Atrybut mod jest liczbą całkowitą reprezentującą naciskany modyfikator. Wartość całkowita każdego modyfikatora jest przechowywana w module gry pod nazwą KMOD_ i ich nazwą. Na przykład przesunięcie w lewo nazywa się KMOD_LSHIFT , Tab nazywa się KMOD_TAB a Ctrl - KMOD_CTRL .

Przykład

Ten kod sprawdzi, czy użytkownik nacisnął a , Lewy Shift + a lub Caps + a .

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.")

Wydarzenia z myszką

Istnieją trzy typy zdarzeń myszy w MOUSEMOTION MOUSEBUTTONDOWN MOUSEMOTION , MOUSEBUTTONDOWN i MOUSEBUTTONUP . Pygame zarejestruje te zdarzenia po ustawieniu trybu wyświetlania.

MOUSEMOTION jest odbierany, gdy użytkownik porusza myszą po ekranie. Ma buttons atrybutów, pos i rel .

  • buttons to krotka wskazująca, czy naciskane są przyciski myszy ( left , mouse-wheel , right ).
  • pos jest pozycją bezwzględną ( x , y ) kursora w pikselach.
  • rel jest pozycją względem poprzedniej pozycji ( rel_x , rel_y ) w pikselach.

MOUSEBUTTONDOWN i MOUSEBUTTONUP są odbierane, gdy użytkownik naciśnie lub zwolni przycisk myszy. Mają atrybuty button i pos .

  • button to liczba całkowita reprezentująca naciskany przycisk. 1 dla lewego przycisku, 2 dla kółka myszy i 3 dla prawego przycisku.
  • pos jest bezwzględne położenie myszy ( x , y ), gdy użytkownik naciśnie przycisk myszy.

Przykład

Oto krótki przykład wykorzystujący niektóre atrybuty każdego zdarzenia myszy:

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")

Ponieważ w module pygame nie ma predefiniowanych stałych dla atrybutu przycisku myszy, oto wartości dla każdego z nich:

Przycisk Wartość
Lewy przycisk myszy 1
Przycisk kółka myszy 2)
Prawy przycisk myszy 3)
Kółko myszy przewiń w górę 4
Kółko myszy przewiń w dół 5

Przewijanie przycisku myszy spowoduje wygenerowanie pygame.MOUSEBUTTONDOWN i pygame.MOUSEBUTTONUP .

Sprawdzanie stanu

Możliwe jest wywoływanie funkcji z pygame.key i pygame.mouse celu otrzymania stanu klawisza i myszy. Nie jest to jednak zalecany sposób przetwarzania zdarzeń w grze pygame, ponieważ występują w nim pewne wady:

  • Otrzymasz stany, gdy funkcja zostanie wywołana, co oznacza, że możesz przegapić zdarzenia między połączeniami, jeśli użytkownik szybko naciska przyciski.

  • Nie można ustalić kolejności wydarzeń.

  • Nadal musisz wywołać jedną z funkcji zdarzeń pygame, aby pygame mogła wewnętrznie współdziałać z systemem operacyjnym, w przeciwnym razie ostrzeże, że program przestał reagować. Funkcje, które możesz wywołać to:

    • pygame.event.get() aby uzyskać wszystkie zdarzenia lub typy zdarzeń (przekazując typy jako argument) z kolejki.
    • pygame.event.poll() aby pobrać jedno zdarzenie z kolejki.
    • pygame.event.wait() aby czekać na jedno zdarzenie z kolejki.
    • pygame.event.clear() aby wyczyścić wszystkie zdarzenia w kolejce.
    • pygame.event.pump() aby pozwolić pygame na obsługę działań wewnętrznych (wywoływane są domyślnie przez powyższe funkcje).

Zdarzenia na klawiaturze

Moduł kluczy ma funkcję pygame.key.get_pressed() która zwraca listę stanu wszystkich kluczy. Lista zawiera 0 dla wszystkich naciśniętych klawiszy i 1 dla wszystkich naciśniętych klawiszy. Jego indeks na liście jest zdefiniowany przez stałe w module gry, wszystkie z prefiksem K_ i nazwą klucza.

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()

Jeśli chcesz sprawdzić pojedyncze naciśnięcie klawisza zamiast przytrzymania klawisza, możesz zapisać poprzedni stan wszystkich klawiszy w zmiennej tymczasowej i sprawdzić, czy wartość się zmienia:

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

Instrukcja ma wartość true tylko wtedy, gdy bieżący klawisz jest wciśnięty, a poprzedni klawisz nie jest wciśnięty. Aby sprawdzić, czy użytkownik zwolnił klucz, musisz jedynie zmienić słowo kluczowe inne not słowo kluczowe ( if not key[pygame.K_q] and previous_key[pygame.K_q] ). Aby to działało poprawnie, musisz ustawić zmienną previous_key = pygame.key.get_pressed() przed pętlą gry, w przeciwnym razie otrzymasz błąd NameError .

Wydarzenia z myszką

Moduł myszy ma funkcje, które pozwalają nam sprawdzać i ustawiać pozycję myszy, a także sprawdzać naciskane przyciski. Funkcja pygame.mouse.get_pressed() zwraca krotkę reprezentującą, czy naciskane są przyciski myszy (lewy, kółko myszy, prawy).

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow