pygame
Obsługa zdarzeń
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 i3
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()