pygame
Manipolazione degli eventi
Ricerca…
Ciclo degli eventi
Pygame registrerà tutti gli eventi dell'utente in una coda di eventi che può essere ricevuta con il codice pygame.event.get()
. Ogni elemento in questa coda è un oggetto Event
e avranno tutti il type
attributo, che è un numero intero che rappresenta il tipo di evento. Nel modulo pygame ci sono costanti integer predefinite che rappresentano il tipo. Tranne questo attributo, gli eventi hanno attributi diversi.
Nome costante | attributi |
---|---|
SMETTERE | nessuna |
ACTIVEEVENT | guadagno, stato |
keydown | unicode, chiave, mod |
keyup | chiave, mod |
MOUSEMOTION | pos, rel, buttons |
MOUSEBUTTONUP | pos, pulsante |
MOUSEBUTTONDOWN | pos, pulsante |
JOYAXISMOTION | gioia, asse, valore |
JOYBALLMOTION | gioia, palla, rel |
JOYHATMOTION | gioia, cappello, valore |
JOYBUTTONUP | gioia, pulsante |
JOYBUTTONDOWN | gioia, pulsante |
VIDEORESIZE | taglia, w, h |
VIDEOEXPOSE | nessuna |
USEREVENT | codice |
Esempio
Per gestire i nostri eventi, eseguiamo semplicemente il ciclo della coda, controlliamo di che tipo si tratta (con l'aiuto delle costanti predefinite nel modulo pygame) e quindi eseguiamo qualche azione. Questo codice controlla se l'utente ha premuto il pulsante di chiusura nell'angolo superiore del display e, in caso affermativo, termina il programma.
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
ATTENZIONE : devi chiamare regolarmente la coda degli eventi quando usi pygame! Oltre al recupero degli eventi disponibili, chiamare la coda degli eventi è anche il modo in cui pygame interagisce internamente con il sistema operativo. Se la coda degli eventi non viene chiamata regolarmente, il sistema operativo supporrà che il tuo programma non funzioni più correttamente e che probabilmente assomigli al programma in crash (in Windows la finestra diventa bianca). Se non vuoi fare nulla con gli eventi dovresti chiamare pygame.event.pump()
ogni loop di gioco per far processare internamente gli eventi da pygame.
Eventi della tastiera
Esistono due tipi di eventi chiave in pygame: KEYDOWN
e KEYUP
. Questi eventi hanno una key
attributo che è un numero intero che rappresenta un tasto sulla tastiera. Il modulo pygame ha costanti integer predefinite che rappresentano tutte le chiavi comuni. Le costanti sono denominate con la K
maiuscola, un trattino basso e il nome della chiave. Ad esempio, <- è denominato K_BACKSPACE
, a è denominato K_a
e F4 è denominato K_F4
.
Esempio
Questo codice controllerà se l'utente ha premuto w , a , s o 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!")
modificatori
Non esiste una costante intera per lettere maiuscole. Invece, gli eventi chiave hanno un altro attributo chiamato mod
, che è i modificatori ( shift , ctrl , alt ecc.) Che vengono premuti simultaneamente come chiave. L'attributo mod
è un numero intero che rappresenta il modificatore che viene premuto. Il valore intero di ogni modificatore è memorizzato nel modulo pygame sotto il nome di KMOD_
e il loro nome. Ad esempio, lo spostamento a sinistra è denominato KMOD_LSHIFT
, Tab è denominato KMOD_TAB
e Ctrl è denominato KMOD_CTRL
.
Esempio
Questo codice controllerà se l'utente ha premuto a , Maiusc + a o Maiusc + 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.")
Eventi del mouse
Esistono tre tipi di eventi del mouse in MOUSEMOTION
, MOUSEBUTTONDOWN
e MOUSEBUTTONUP
. Pygame registrerà questi eventi quando è stata impostata una modalità di visualizzazione.
MOUSEMOTION
viene ricevuto quando l'utente sposta il mouse sul display. Ha i buttons
degli attributi, pos
e rel
.
-
buttons
sono una tupla che rappresenta se i pulsanti del mouse (left
,mouse-wheel
,right
) vengono premuti o meno. -
pos
è la posizione assoluta (x
,y
) del cursore in pixel. -
rel
è la posizione relativa alla posizione precedente (rel_x
,rel_y
) in pixel.
MOUSEBUTTONDOWN
e MOUSEBUTTONUP
vengono ricevuti quando l'utente preme o rilascia un pulsante del mouse. Hanno gli attributi button
e pos
.
-
button
è un numero intero che rappresenta il pulsante premuto.1
per il tasto sinistro, 2 per la rotella del mouse e3
per il tasto destro. -
pos
è la posizione assoluta del mouse (x
,y
) quando l'utente preme il pulsante del mouse.
Esempio
Ecco un breve esempio che utilizza alcuni degli attributi di ciascun evento del mouse:
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")
Poiché non ci sono costanti predefinite per l'attributo del pulsante del mouse nel modulo pygame, ecco i valori per ciascuno:
Pulsante | Valore |
---|---|
Tasto sinistro del mouse | 1 |
Pulsante della rotellina del mouse | 2 |
Pulsante destro del mouse | 3 |
Rotellina del mouse scorrere verso l'alto | 4 |
Rotellina del mouse scorrere verso il basso | 5 |
Scorrendo il pulsante del mouse verranno generati pygame.MOUSEBUTTONUP
eventi pygame.MOUSEBUTTONDOWN
e pygame.MOUSEBUTTONUP
.
Controllo dello stato
È possibile chiamare le funzioni dal modulo pygame.key
e pygame.mouse
per ricevere lo stato della chiave e del mouse. Tuttavia, non è il modo consigliato di processare gli eventi in pygame dato che ci sono alcuni difetti con esso:
Riceverai gli stati quando viene chiamata la funzione, il che significa che potresti perdere gli eventi tra una chiamata e l'altra se l'utente sta premendo rapidamente i pulsanti.
Non è possibile determinare l'ordine degli eventi.
Devi comunque chiamare una delle funzioni di evento di pygame per pygame per interagire internamente con il sistema operativo, altrimenti avviserà che il programma non ha risposto. Le funzioni che puoi chiamare sono:
-
pygame.event.get()
per ottenere tutti gli eventi o tipi di eventi (passando i tipi come argomento) dalla coda. -
pygame.event.poll()
per ottenere un singolo evento dalla coda. -
pygame.event.wait()
per attendere un singolo evento dalla coda. -
pygame.event.clear()
per cancellare tutti gli eventi nella coda. -
pygame.event.pump()
per consentire a pygame di gestire azioni interne (è chiamato implicitamente dalle funzioni sopra).
-
Eventi della tastiera
Il modulo chiave ha una funzione pygame.key.get_pressed()
che restituisce una lista dello stato di tutte le chiavi. L'elenco contiene 0
per tutti i tasti che non sono premuti e 1
per tutti i tasti premuti. Il suo indice nella lista è definito da costanti nel modulo pygame, il tutto preceduto da K_
e il nome della chiave.
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()
Se si desidera controllare la pressione di un singolo tasto invece di tenere premuto il tasto, è possibile memorizzare lo stato precedente di tutte le chiavi in una variabile temporanea e verificare se il valore cambia:
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
L'istruzione viene valutata su true solo quando il tasto corrente viene premuto e il tasto precedente non viene premuto. Per verificare se l'utente ha rilasciato la chiave devi solo cambiare la parola chiave not
( if not key[pygame.K_q] and previous_key[pygame.K_q]
). Affinché funzioni correttamente, devi impostare la variabile previous_key = pygame.key.get_pressed()
prima del ciclo di gioco, altrimenti riceverai un NameError
.
Eventi del mouse
Il modulo del mouse ha funzioni che ci permettono di controllare e impostare la posizione del mouse e di controllare i pulsanti premuti. La funzione pygame.mouse.get_pressed()
restituisce una tupla di tupla che rappresenta se i pulsanti del mouse (sinistra, rotellina del mouse, destra) vengono premuti o meno.
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()