pygame
Gestion des événements
Recherche…
Boucle d'événement
Pygame enregistrera tous les événements de l'utilisateur dans une file d'attente d'événements pouvant être reçue avec le code pygame.event.get()
. Chaque élément de cette file d'attente est un objet Event
et ils auront tous le type
attribut, qui est un entier représentant le type d'événement. Dans le module pygame, il existe des constantes entières prédéfinies représentant le type. À l'exception de cet attribut, les événements ont des attributs différents.
Nom constant | Les attributs |
---|---|
QUITTER | aucun |
ACTIVEEVENT | gain, état |
TOUCHE BAS | unicode, clé, mod |
KEYUP | clé, mod |
MOUSEMOTION | pos, rel, boutons |
MOUSEBUTTONUP | pos, bouton |
MOUSEBUTTONDOWN | pos, bouton |
JOYAXISMOTION | joie, axe, valeur |
JOYBALLMOTION | joie, bal, rel |
JOYHATMOTION | joie, chapeau, valeur |
JOYBUTTONUP | joie, bouton |
JOYBUTTONDOWN | joie, bouton |
VIDEORESIZE | taille, w, h |
VIDEOEXPOSE | aucun |
USEREVENT | code |
Exemple
Pour gérer nos événements, nous parcourons simplement la file d'attente, vérifions le type (à l'aide des constantes prédéfinies dans le module pygame) et exécutons une action. Ce code vérifie si l'utilisateur a appuyé sur le bouton de fermeture dans le coin supérieur de l'écran et, si tel est le cas, termine le programme.
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
ATTENTION : vous devez appeler la file d'attente des événements régulièrement lorsque vous utilisez pygame! Outre la récupération des événements disponibles, l'appel de la file d'attente d'événements est également la manière dont pygame peut interagir avec le système d'exploitation en interne. Si la file d'attente des événements n'est pas appelée régulièrement, votre système d'exploitation supposera que votre programme ne fonctionnera plus correctement et fera peut-être croire que le programme est bloqué (dans Windows, la fenêtre devient blanche). Si vous ne voulez rien faire avec les événements, vous devez appeler pygame.event.pump()
chaque boucle de jeu pour que pygame traite les événements en interne.
Événements clavier
Il existe deux types d'événements clés dans pygame: KEYDOWN
et KEYUP
. Ces événements ont une key
attribut qui est un entier représentant une touche du clavier. Le module pygame possède des constantes entières prédéfinies représentant toutes les clés communes. Les constantes sont nommées avec un K
majuscule, un trait de soulignement et le nom de la clé. Par exemple, <- s'appelle K_BACKSPACE
, a s'appelle K_a
et F4 s'appelle K_F4
.
Exemple
Ce code vérifiera si l'utilisateur a appuyé sur w , a , s ou 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!")
Modificateurs
Il n'y a pas de constante entière pour les majuscules. Au lieu de cela, les événements clés ont un autre attribut appelé mod
, qui consiste à appuyer simultanément sur les modificateurs ( shift , ctrl , alt, etc.) en tant que clé. L'attribut mod
est un entier représentant le modificateur pressé. La valeur entière de chaque modificateur est stockée dans le module pygame sous le nom de KMOD_
et son nom. Par exemple, Left shift est nommé KMOD_LSHIFT
, Tab est nommé KMOD_TAB
et Ctrl est nommé KMOD_CTRL
.
Exemple
Ce code vérifie si l'utilisateur a appuyé sur a , Maj gauche + a ou Caps + 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.")
Événements souris
Il existe trois types d’événements de souris dans pygame MOUSEMOTION
, MOUSEBUTTONDOWN
et MOUSEBUTTONUP
. Pygame enregistrera ces événements lorsqu'un mode d'affichage a été défini.
MOUSEMOTION
est reçu lorsque l'utilisateur déplace sa souris sur l'écran. Il a les buttons
attributs, pos
et rel
.
-
buttons
est un tuple représentant si les boutons de la souris (left
,mouse-wheel
,right
) sont pressés ou non. -
pos
est la position absolue (x
,y
) du curseur en pixels. -
rel
est la position relative à la position précédente (rel_x
,rel_y
) en pixels.
MOUSEBUTTONDOWN
et MOUSEBUTTONUP
sont reçus lorsque l'utilisateur appuie ou relâche un bouton de la souris. Ils ont le button
attributs et pos
.
-
button
est un entier représentant le bouton pressé.1
pour le bouton gauche, 2 pour la molette et3
pour le bouton droit. -
pos
est la position absolue de la souris (x
,y
) lorsque l'utilisateur appuie sur le bouton de la souris.
Exemple
Voici un court exemple utilisant certains des attributs de chaque événement de souris:
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")
Comme il n'y a pas de constantes prédéfinies pour l'attribut du bouton de la souris dans le module pygame, voici les valeurs pour chacun:
Bouton | Valeur |
---|---|
Bouton gauche de la souris | 1 |
Bouton de la molette de la souris | 2 |
Bouton droit de la souris | 3 |
Molette de la souris défiler vers le haut | 4 |
Molette de la souris défiler vers le bas | 5 |
pygame.MOUSEBUTTONDOWN
pygame.MOUSEBUTTONUP
le bouton de la souris pygame.MOUSEBUTTONUP
événements pygame.MOUSEBUTTONDOWN
et pygame.MOUSEBUTTONUP
.
Vérification d'état
Il est possible d'appeler des fonctions du module pygame.key
et pygame.mouse
pour recevoir l'état de la clé et de la souris. Cependant, ce n'est pas la méthode recommandée pour traiter les événements dans pygame, car il y a quelques défauts:
Vous recevrez les états lorsque la fonction est appelée, ce qui signifie que vous pouvez manquer des événements entre les appels si l'utilisateur appuie sur les boutons rapidement.
Vous ne pouvez pas déterminer l'ordre des événements.
Vous devez toujours appeler l'une des fonctions d'événement de pygame pour que pygame puisse interagir en interne avec le système d'exploitation, sinon il vous avertira que le programme ne répond plus. Les fonctions que vous pouvez appeler sont:
-
pygame.event.get()
pour obtenir tous les événements ou types d'événement (en transmettant les types en tant qu'argument) à partir de la file d'attente. -
pygame.event.poll()
pour obtenir un seul événement de la file d'attente. -
pygame.event.wait()
pour attendre un seul événement de la file d'attente. -
pygame.event.clear()
pour effacer tous les événements de la file d'attente. -
pygame.event.pump()
pour permettre à pygame de gérer les actions internes (est appelé implicitement par les fonctions ci-dessus).
-
Événements clavier
Le module clé a une fonction pygame.key.get_pressed()
qui renvoie une liste de l'état de toutes les clés. La liste contient 0
pour toutes les touches qui ne sont pas enfoncées et 1
pour toutes les touches sur lesquelles vous appuyez. Son index dans la liste est défini par des constantes dans le module pygame, toutes préfixées par K_
et le nom de la clé.
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()
Si vous souhaitez rechercher une seule touche au lieu de la maintenir enfoncée, vous pouvez enregistrer l'état précédent de toutes les clés dans une variable temporaire et vérifier si la valeur change:
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'instruction ne vaut que lorsque la touche actuelle est enfoncée et que la touche précédente n'est pas enfoncée. Pour vérifier si l'utilisateur a relâché la clé, il suffit de changer le mot-clé not
( if not key[pygame.K_q] and previous_key[pygame.K_q]
). Pour que cela fonctionne correctement, vous devez définir la variable previous_key = pygame.key.get_pressed()
avant la boucle du jeu, sinon vous recevrez une NameError
.
Événements souris
Le module souris a des fonctions qui nous permettent de vérifier et de définir la position de la souris et de vérifier les boutons pressés. La fonction pygame.mouse.get_pressed()
renvoie un tuple représentant si les boutons de la souris (gauche, molette de la souris, droite) sont enfoncés ou non.
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()