La funzione event.post() di pygame
Per forzare un evento predefinito o personalizzato in pygame uso la funzione pygame.event.post.
pygame.event.post(x)
Dove x è una lista composta dall'evento e dagli eventuali attributi dell'evento separati da virgola.
L'evento viene posizionato alla fine della coda degli eventi.
A cosa serve?
Mi permette di creare nuovi eventi ad hoc e anche simulare eventi esistenti. Ad esempio, gli eventi delle azioni del giocatore come la pressione di un tasto della tastiera o del mouse.
Un esempio pratico
Esempio 1 (evento personalizzato)
In questo script genero un evento personalizzato.
- import pygame
- pygame.init()
- screen = pygame.display.set_mode((400,300))
- PROVA=pygame.USEREVENT+1
- myevent = pygame.event.Event(PROVA, messaggio="ciao")
- pygame.event.post(myevent)
- running=True
- while running:
- for event in pygame.event.get():
- print(event)
- if event.type == PROVA:
- print(event.messaggio)
- if event.type == pygame.QUIT:
- running=False
Nella riga 4 creo un evento personalizzato PROVA.
PROVA=pygame.USEREVENT+1
Dove USEREVENT è la variabile di sistema in cui è registrato il valore id più alto tra quelli usati da pygame per gli eventi.
Quindi, USEREVENT+1 assegna all'evento PROVA un id con valore più alto di una unità
Nota. Per definire più eventi personalizzati devo assegnarli un id diverso. Ad esempio USERVENT+1, USERVENT+2, ecc. In questo caso c'è un solo evento personalizzato.
Nella riga 5 assegno alla variabile myevent l'evento PROVA tramite pygame.event.Event().
myevent = pygame.event.Event(PROVA, messaggio="ciao")
Nella riga 6 genero l'evento personalizzato tramite pygame.event.post()
pygame.event.post(myevent)
L'evento viene aggiunto alla coda degli eventi.
Quando il programma legge l'evento lo stampa a video
<Event(32848-UserEvent {'messaggio': 'ciao'})>
Nelle righe 11-12 lo script riconosce l'evento PROVA stampando il valore contenuto nell'attributo messaggio ossia "ciao".
Nota. All'evento PROVA è stato assegnato l'id 32848 tramite USEREVENT+1. Questo vuol dire che pygame ha già impegnato i valori fino a 32847 per gli eventi predefiniti.
Esempio 2 (evento predefinito)
In questo script simulo la pressione di un tasto da parte dell'utente.
- import pygame
- pygame.init()
- screen = pygame.display.set_mode((400,300))
- myevent=pygame.event.Event(KEYDOWN, key=K_SPACE, mod=0)
- pygame.event.post(myevent)
- running=True
- while running:
- for event in pygame.event.get():
- print(event)
- if event.type == PROVA:
- print(event.messaggio)
- if event.type == pygame.QUIT:
- running=False
Nella riga 4 assegno alla variabile myevent un oggetto di tipo evento.
In particolar modo gli assegno l'evento KEYDOWN con attributo K_SPACE che equivale alla pressione della barra spaziatrice sulla tastiera del PC.
myevent=pygame.event.Event(KEYDOWN, key=K_SPACE, mod=0)
Nella riga 5 simulo l'evento tramite la funzione event.post()
pygame.event.post(myevent)
L'evento viene aggiunto alla coda degli eventi.
<Event(768-KeyDown {'key': 32, 'mod': 0})>
Anche se l'utente non ha premuto la barra spaziatrice, il programma rileva l'evento come se l'avesse fatto.
Nota aggiuntiva
Un evento può essere sollevato in due modi alternativi
myevent=pygame.event.Event(KEYDOWN, key=K_SPACE, mod=0)
myevent = pygame.event.Event(KEYDOWN, {"key":K_SPACE, "mod":0})
Sono due modi diversi per ottenere lo stesso risultato.
E così via.