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.

    1. import pygame
    2. pygame.init()
    3. screen = pygame.display.set_mode((400,300))
    4. PROVA=pygame.USEREVENT+1
    5. myevent = pygame.event.Event(PROVA, messaggio="ciao")
    6. pygame.event.post(myevent)
    7. running=True
    8. while running:
    9. for event in pygame.event.get():
    10. print(event)
    11. if event.type == PROVA:
    12. print(event.messaggio)
    13. if event.type == pygame.QUIT:
    14. 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.

    1. import pygame
    2. pygame.init()
    3. screen = pygame.display.set_mode((400,300))
    4. myevent=pygame.event.Event(KEYDOWN, key=K_SPACE, mod=0)
    5. pygame.event.post(myevent)
    6. running=True
    7. while running:
    8. for event in pygame.event.get():
    9. print(event)
    10. if event.type == PROVA:
    11. print(event.messaggio)
    12. if event.type == pygame.QUIT:
    13. 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.

     


     

    Segnalami un errore, un refuso o un suggerimento per migliorare gli appunti

    FacebookTwitterLinkedinLinkedin
    knowledge base

    PyGame