Eventi in pygame

In questa lezione studieremo gli eventi in pygame, necessari per interagire con il nostro programma.

Per capire come funzionano gli eventi facciamo un semplice esempio.

Quando lavoriamo al computer il sistema operativo gestisce e controlla tutto, se facciamo clic con il mouse, se premiamo un tasto sulla nostra tastiera, ecc.

Dunque, quando facciamo qualcosa, il sistema operativo genera un evento di sistema, cioè in poche parole crea un messaggio con le informazioni di ciò che è accaduto. Questi messaggi vengono poi messi in una coda, in ordine di arrivo, in quanto ci possono essere tanti eventi di sistema.

Le applicazioni che ricevono questi messaggi possono ignorarli oppure esaminarli per capire cosa fare.

Eventi in pygame con l’oggetto Event

Pygame ha l’oggetto Event, quindi registra gli eventi dell’utente in una coda di eventi che può essere ricevuta con il codice pygame.event.get().

Dunque ad esempio proviamo a scrivere questo semplice programma:

import pygame

pygame.init()
pygame.display.set_mode((800, 600))

#riceviamo gli eventi
for event in pygame.event.get():
    print("Evento: ", event)

Adesso provate questo codice, potete notare che compariranno tutti gli eventi che si sono generati per aprire la finestra che abbiamo creato con set_mode.

Ma il programma così costruito non continua a registrare eventi.

Per fare ciò abbiamo bisogno di un altro ciclo esterno che quando termina gli eventi precedenti, registra quelli nuovi.

Quindi modificate il codice in questo modo:

import pygame

pygame.init()
pygame.display.set_mode((800, 600))

#riceviamo e rigeneriamo nuovi eventi
while True:
    for event in pygame.event.get():
        print('Evento: ', event)

In questo modo se ad esempio muoviamo il mouse noteremo che i nuovi eventi saranno stampati nella finestra di output.

Attributo type

L’attributo type contiene il tipo dell’evento, ad esempio:

QUIT  – per indicare che è stato fatto clic sull’icona per chiudere la finestra.

MOUSEMOTION – è stato mosso il mouse.

MOUSEBUTTONDOWN – è stato premuto un bottone del mouse.

MOUSEBUTTONUP – è stato rilasciato il bottone del mouse.

KEYDOWN – è stato premuto un tasto della tastiera.

KEYUP – è stato rilasciato un tasto della tastiera.


Esempio con QUIT

Possiamo fare in modo di uscire dal programma utilizzando il type QUIT, cambiando la variabile t a False quando si clicca sull’icona per chiudere la finestra:

import pygame

pygame.init()
pygame.display.set_mode((800, 600))

t=True
while t:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            t=False

La funzione pygame.quit() serve per terminare il programma.

Si può anche importare il modulo sys ed utilizzare sys.exit():

import pygame, sys

pygame.init()
pygame.display.set_mode((800, 600))

while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            sys.exit()

Esempi con MOUSEBUTTONDOWN e MOUSEBUTTONUP

Button è un numero intero e rappresenta quindi il pulsante premuto.

Con 1 si indica il pulsante sinistro, con 3 il pulsante destro mentre con 2 la pressione sulla rotella del mouse, con 4 lo spostamento della rotellina verso l’alto e con 5 lo spostamento della rotellina verso il basso.

import pygame, sys

pygame.init()
pygame.display.set_mode((800, 600))


while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1:
                print('Left button')
            elif event.button == 3:
                print('Right button')
        elif event.type == pygame.MOUSEBUTTONUP:
                print('Pulsante rilasciato')

Facciamo adesso un secondo esempio d’uso di MOUSEBUTTONDOWN dove visualizzeremo le coordinate x e y al clic del mouse.

import pygame, sys

pygame.init()
pygame.display.set_mode((800, 600))


while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.MOUSEBUTTONDOWN:
            p_x = event.pos[0]
            p_y = event.pos[1]
            print('Hai fatto click in x =',p_x,' e y =',p_y)

Esempi con MOUSEMOTION

MOUSEMOTION viene ricevuto quando spostiamo il mouse sul display.

Ha gli attributi:

pos che rappresenta la posizione assoluta in pixel del cursore e

rel che è la posizione relativa a quella precedente.

Quindi se rel [0] è maggiore di zero vuol dire che ci siamo spostati a destra, invece se è minore a sinistra.

Se invece rel [1] è maggiore di zero vuol dire che ci siamo spostati in basso, al contrario se è minore in alto.

import pygame, sys

pygame.init()
pygame.display.set_mode((800, 600))

while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.MOUSEMOTION:
            if event.rel[0] > 0: 
                print('Ti stai spostando a destra')
            elif event.rel[0] < 0:
                print('Ti stai spostando a sinistra')
            elif event.rel[1] > 0:  
                print('Ti stai spostando sotto')
            elif event.rel[1] < 0:  
                print('Ti stai spostando sopra')

Esempi con KEYDOWN

L’evento keydown ha un attributo key che è un numero intero e rappresenta un tasto della tastiera. Indica quindi quale tasto è stato premuto.

Ad esempio con:

k_UP si indica la freccia in alto,

k_DOWN la freccia in basso,

k_ESCAPE il tasto ESC,

k_TAB il pulsante TAB,

k_w la lettera w della tastiera, ecc…

Ecco dunque un semplice esempio:

import pygame, sys

pygame.init()
pygame.display.set_mode((800, 600))

while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                print('Vai su')
            elif event.key == pygame.K_a:
                print('Vai a sinistra')
            elif event.key == pygame.K_s:
               print('Vai giù')
            elif event.key == pygame.K_d:
                print('Vai a destra')

Facciamo adesso un altro esempio, stampando il carattere se l’attributo unicode contiene effettivamente un carattere.

import pygame, sys

pygame.init()
pygame.display.set_mode((800, 600))


while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:            
            if (len(event.unicode)) == 1:
                print(event.unicode) 
            else:
                print('Non stampabile')

Alcuni link utili

Indice tutorial sul linguaggio python

1 – Introduzione al linguaggio python

2 – Le variabili in python

3 – Operatori aritmetici e di assegnazione in python

4 – Stringhe in python

5 – Casting in python

6 – Input e print in python

7 – Primi esercizi in python

8 – Errori in python

9 – Script python

10 – Scambio di variabili in python

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *