Aller au contenu

CHAPITRE 3


Gérer les événements⚓︎

Présentation⚓︎

Les événements sont la base des interfaces Humain-Machine (IHM)1 : frappe au clavier, mouvement ou clic de souris etc. ils sont stockés dans une file d'attente appelée buffer. Ci-dessous un exemple de buffer qui contient 5 événements :

buffer d'événements

pygame nous offre le moyen de parcourir ce buffer pour y récupérer les events :

  1. pygame.event.get() : l'accès au buffer
  2. la boucle for
Les concepts
  1. la boucle bornée for ou encore ma bafouille à propose de la notion d'itérer en Python
  2. l'instruction conditionnelle if

Voici comment parcourir les events :

for event in pygame.event.get():
    # ici nous allons traiter l'événement event
Les différents type d'event

Lorsqu'on a un event, on a accès à son type : event.type. Pygame définit un certain nombre de type d'event dont voici les principaux :

type d'événement provoqué par...
pygame.QUIT fermeture de la fenêtre
pygame.KEYDOWN enfoncement d'une touche du clavier
pygame.KEYUP relâchement d'une touche du clavier
pygame.MOUSEMOTION mouvement de la souris
pygame.MOUSEBUTTONUP enfoncement d'un bouton de la souris
pygame.MOUSEBUTTONDOWN relâchement d'un bouton de la souris

Nous pouvons modifier notre classe Jeu pour quitter lorsque la croix de la fenêtre est utilisée :

class Jeu:
    ...
    def loop(self):
        fini = False
        while not fini:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    fini = True

Mais, vous vous rendez-compte que notre variable booléenne fini ne sert pas à grand-chose puisque dès qu'on clique sur la croix de toute façon la fenêtre se ferme, quittant tout.

snake_05.py

import pygame
from constantes import *

class Jeu:

    def __init__(self):
        self.ecran = pygame.display.set_mode((LARGEUR, HAUTEUR))

    def start(self):
        pygame.init()
        self.loop()

    def loop(self):
        fini = False
        while not fini:
            for event in pygame.event.get():
                if event.type == pygame.QUIT: 
                    fini = True

mon_jeu = Jeu()
mon_jeu.start()

Exercice⚓︎

À faire vous-même

Dans un fichier snake_06.py changer votre précédent script pour :

  1. Afficher un coucou (comme au début) lorsque l'utilisateur clique ;
  2. Quitter en disant Au revoir, lorsqu'on appuie sur une touche du clavier
import pygame
from constantes import *


class Jeu:
    def __init__(self):
        self.ecran = pygame.display.set_mode((LARGEUR, HAUTEUR)) 

    def start(self):
        pygame.init()
        self.loop()

    def loop(self):
        fini = False
        while not fini:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    fini = True
                if event.type == pygame.MOUSEBUTTONDOWN:
                    print('Vous avez cliqué')
        self.stop()

    def stop(self):
        print('Au revoir')
        pygame.quit()    

snake_game = Jeu()
snake_game.start()

Nous constatons que les événements sont très pratiques et nous pouvons maintenant les manipuler. Lorsque l'on a un événement d'un certain type, cet événement possède des propriétés liées à ce type. Par exemple, si event est de type pygame.KEYDOWN alors la propriété key permet de savoir à quelle touche on a à faire.

Il existe une constante pygame pour chaque touche. On trouve ce tableau ici : les constantes pygame pour les touches.

Par exemple si le test event.key == pygame.K_UP est vrai cela signifie qu'on a pressé la touche flèche vers le haut de notre clavier.

Tout est pratiquement en place pour commencer à modéliser notre jeu SNAKE. Rendez-vous au chapitre suivant.


  1. Écouter Wendy Mackay, spécialiste des interfaces Humain-Machine, lors de la leçon inaugurale de la chaire d'Informatique 2021--2022, au Collège de France. 

Retour en haut de la page