oujood.com

Traitement des événements personnalisés en pygame

Dans ce tutoriel, nous verrons comment ajouter des événements personnalisés dans PyGame, création d'événements personnalisés avec Pygame et exemples pratiques d'utilisation

Comment ajouter des événements personnalisés dans Pygame ?

En plus des événements fournis par PyGame (par exemple KEYDOWN et KEYUP), PyGame nous permet de créer nos propres événements personnalisés en fonction des besoins de notre jeu. Les événements personnalisés augmentent le contrôle et la flexibilité de notre jeu. Un événement personnalisé est un événement défini par l'utilisateur. Pygame définit les éventements comme des entiers. Un évènement doit être unique

comme le dernier événement réservé par pygame s'appelle USEREVENT, donc définir EVENEMENT_PERSONALISE = pygame.USEREVENT + 1 permet de s'assurer qu'il est unique.

Syntaxe :

<nom_de_l'événement> = pygame.USEREVENT + 1

Exemple :

# Ici ADDITION et SUBTRACTION est le nom de l'événement
ADDITION = pygame.USEREVENT + 1
SUBTRACTION = pygame.USEREVENT + 2

Maintenant, comment publier nos événements personnalisés une fois qu'ils sont créés ? Cela peut se faire de deux manières :
En utilisant la méthode pygame.event.post().
En utilisant la méthode pygame.time.set_timer().

Utilisation de la méthode pygame.event.post()

On peut directement poster les événements en utilisant la méthode pygame.event.post(). La méthode ajoute l'événement à la fin des événements de la file d'attente. Afin d'exécuter cette méthode, nous devons convertir notre événement au type d'événement de Pygame afin de correspondre aux attributs de la méthode post et d'éviter les erreurs.
Syntaxe :

# Etape 1 - Convertir l'événement dans le type de données event de pygame 

ADD_event = pygame.event.Event(event)# nom_de_l'événement comme paramètre

# Etape 2 - Poster l'événement

pygame.event.post(ADD_event) 

Utilisation de la méthode pygame.time.set_timer()

Diffuser l'événement périodiquement en utilisant les timers de PyGame. Ici, on va utiliser une autre méthode pour publier l'événement en utilisant la fonction set_timer(), qui prend deux paramètres, un nom d'événement utilisateur et un intervalle de temps en millisecondes.
Syntaxe :

# nom_de_l'événement, temps en ms

# nom_de_l'événement, temps en ms

pygame.time.set_timer(event, duration)   

Note : Dans ce cas, on n'a pas besoin de convertir l'événement défini par l'utilisateur en un type de données d'événement PyGame.

Pour créer un écran avec des événements personnalisés, il faut tout d'abord définir les attributs de l'écran en fonction des besoins. Ensuite, créez un événement et convertissez-le en type de données d'événement PyGame. Ajoutez ensuite du code pour vos opérations qui génèreront un événement personnalisé.

Dans les exemples donnés, les deux approches ont été prises en compte.

Exemple :     📋 Copier le code

# Programme Python pour ajouter des événements personnalisés 
import pygame 
pygame.init() 

# Configurer l'écran et la minuterie 
screen = pygame.display.set_mode((500, 500)) 
timer = pygame.time.Clock() 

# Définir le titre 
pygame.display.set_caption('Événements personnalisés') 

# définir les couleurs 
BLANC = (255, 255, 255) 
ROUGE = (255, 0, 0) 
VERT = (0, 255, 0) 
BLEU = (0, 0, 255) 

# garder une trace de la variable active 
bg_active_color = BLANC 
screen.fill(BLANC) 

# événement utilisateur personnalisé pour changer de couleur 
CHANGE_COLOR = pygame.USEREVENT + 1

# événement utilisateur personnalisé pour gonfler/dégonfle  
# boîte 
ON_BOX = pygame.USEREVENT + 2

# création d'un Rectangle 
box = pygame.Rect((225, 225, 50, 50)) 
grow = True

# envoi d'un événement pour changer de couleur 
# toutes les 500ms 
pygame.time.set_timer(CHANGE_COLOR, 500) 

running = True
while running : 
	
	# vérifie si tous les événements sont affichés 
	# et en fonction de cela effectue les 
	# opérations nécessaires 
	for event in pygame.event.get() : 
		
		# changement de couleur après chaque 
		# 500ms 
		if event.type == CHANGE_COLOR : 
			if bg_active_color == VERT : 
				screen.fill(VERT) 
				bg_active_color = BLANC 
			elif bg_active_color ==BLANC : 
				screen.fill(BLANC) 
				bg_active_color = VERT 

		if event.type == ON_BOX : 
			
			# pour gonfler et dégonfler la boîte 
			if grow : 
				box.inflate_ip(3, 3) 
				grow = box.width < 75
			else : 
				box.inflate_ip(-3, -3) 
				grow = box.width < 50

		if event.type == pygame.QUIT : 
			
			# pour quitter le programme 
			running = False
    # Événement d'affichage lorsque le curseur est sur 
	# la boîte 
	if box.collidepoint(pygame.mouse.get_pos()) : 
		pygame.event.post(pygame.event.Event(ON_BOX))

	# Dessiner un rectangle sur l'écran 
	pygame.draw.rect(screen, ROUGE, box) 

	# Mise à jour de l'écran 
	pygame.display.update() 
	
	# Réglage du nombre d'images par seconde 
	timer.tick(30) 

pygame.quit() 

Le code crée une fenêtre Pygame, gère les événements personnalisés, change la couleur de fond toutes les 500ms, et fait gonfler/dégonfler le rectangle lorsqu'il est survolé par la souris. Enfin, il termine l'exécution de Pygame à la fermeture de la fenêtre.

Dans l'exemple ci-dessus, on a utilisé la méthode .post() pour gonfler/dégonfler la boîte lorsque le curseur se trouve en haut de la boîte et la méthode .set_timer() pour changer la couleur d'arrière-plan toutes les 500 ms.

Exemple de la création de quatre événements personnalisés :

Si vous souhaitez par exemple créer quatre événements personnalisés avec Pygame, suivez le même processus en définissant un identifiant unique pour chacun de vos événements et en créant des instances distinctes de la classe pygame.event.Event pour chacun d'eux.

Exemple :     📋 Copier le code

import pygame
from pygame.locals import QUIT, USEREVENT

# Définir des identifiants uniques pour vos événements personnalisés
EVENEMENT_1 = USEREVENT + 1
EVENEMENT_2 = USEREVENT + 2
EVENEMENT_3 = USEREVENT + 3
EVENEMENT_4 = USEREVENT + 4

# Créer des instances d'événements personnalisés avec des paramètres
evenement_1 = pygame.event.Event(EVENEMENT_1, parametre1="Valeur1", parametre2=42)
evenement_2 = pygame.event.Event(EVENEMENT_2, parametre1="AutreValeur", parametre2=100)
evenement_3 = pygame.event.Event(EVENEMENT_3, parametre1="EncoreUneValeur", parametre2=73)
evenement_4 = pygame.event.Event(EVENEMENT_4, parametre1="DerniereValeur", parametre2=55)

# Ajouter les événements à la file d'événements
pygame.event.post(evenement_1)
pygame.event.post(evenement_2)
pygame.event.post(evenement_3)
pygame.event.post(evenement_4)

# Initialiser Pygame
pygame.init()

# Configurer la fenêtre
largeur, hauteur = 800, 600
ecran = pygame.display.set_mode((largeur, hauteur))
pygame.display.set_caption("Événements personnalisés Pygame")

# Boucle principale
continuer = True
while continuer:
    for event in pygame.event.get():
        if event.type == QUIT:
            continuer = False
        elif event.type == EVENEMENT_1:
            print("Événement 1 détecté:")
            print("Paramètre 1:", event.parametre1)
            print("Paramètre 2:", event.parametre2)
        elif event.type == EVENEMENT_2:
            print("Événement 2 détecté:")
            print("Paramètre 1:", event.parametre1)
            print("Paramètre 2:", event.parametre2)
        elif event.type == EVENEMENT_3:
            print("Événement 3 détecté:")
            print("Paramètre 1:", event.parametre1)
            print("Paramètre 2:", event.parametre2)
        elif event.type == EVENEMENT_4:
            print("Événement 4 détecté:")
            print("Paramètre 1:", event.parametre1)
            print("Paramètre 2:", event.parametre2)

    pygame.display.flip()

# Quitter Pygame
pygame.quit()

Dans cet exemple, chaque événement personnalisé a ses propres identifiants (EVENEMENT_1, EVENEMENT_2, EVENEMENT_3, EVENEMENT_4) et ses propres instances avec des paramètres distincts. Vous pouvez ensuite les détecter et les traiter individuellement dans la boucle principale de votre jeu.

Exemples pratiques d'utilisation d'événements personnalisés dans Pygame

Voici quelques exemples pratiques d'utilisation d'événements personnalisés dans Pygame :

Changement de niveau :
Vous pourriez utiliser un événement personnalisé pour signaler un changement de niveau dans votre jeu. Par exemple, lorsque le joueur atteint un certain objectif ou porte, vous pouvez déclencher un événement personnalisé pour passer au niveau suivant.

Exemple :     📋 Copier le code

NIVEAU_SUIVANT = USEREVENT + 1
pygame.time.set_timer(NIVEAU_SUIVANT, 5000)  # Déclencher l'événement toutes les 5 secondes

# Dans la boucle principale
for event in pygame.event.get():
    if event.type == NIVEAU_SUIVANT:
        changer_niveau()

Système de dialogue :
Utilisez des événements personnalisés pour gérer un système de dialogue dans votre jeu. Lorsque le joueur interagit avec un personnage non-joueur, déclenchez un événement qui affiche le texte approprié à l'écran.

Exemple :     📋 Copier le code

EVENEMENT_DIALOGUE = USEREVENT + 1

# Lorsque le joueur interagit avec un NPC, déclenchez l'événement
pygame.event.post(pygame.event.Event(EVENEMENT_DIALOGUE, texte="Bienvenue dans notre village!"))

# Dans la boucle principale
for event in pygame.event.get():
    if event.type == EVENEMENT_DIALOGUE:
        afficher_texte_a_l_ecran(event.texte)

Gestion des power-ups :
Si votre jeu a des power-ups spéciaux, utilisez des événements personnalisés pour les activer. Par exemple, lorsque le joueur ramasse un power-up, déclenchez un événement pour améliorer temporairement les capacités du joueur.

Exemple :     📋 Copier le code

EVENEMENT_POWERUP = USEREVENT + 1

# Lorsque le joueur ramasse un power-up, déclenchez l'événement
pygame.event.post(pygame.event.Event(EVENEMENT_POWERUP, type_powerup="Invincibilite"))

# Dans la boucle principale
for event in pygame.event.get():
    if event.type == EVENEMENT_POWERUP:
        activer_powerup(event.type_powerup)

Gestion des événements du joueur :
Créez des événements personnalisés pour gérer les actions spécifiques du joueur, comme le saut, la tir, etc. Cela rend le code plus lisible et modulaire.

Exemple :     📋 Copier le code

EVENEMENT_SAUT = USEREVENT + 1
EVENEMENT_TIR = USEREVENT + 2

# Lorsque le joueur appuie sur la touche de saut, déclenchez l'événement
pygame.event.post(pygame.event.Event(EVENEMENT_SAUT))

# Dans la boucle principale
for event in pygame.event.get():
    if event.type == EVENEMENT_SAUT:
        joueur.sauter()

# Lorsque le joueur appuie sur la touche de tir, déclenchez l'événement
pygame.event.post(pygame.event.Event(EVENEMENT_TIR))

# Dans la boucle principale
for event in pygame.event.get():
    if event.type == EVENEMENT_TIR:
        joueur.tirer()

En utilisant des événements personnalisés de manière judicieuse, vous pouvez rendre votre code plus modulaire, facile à comprendre et à étendre. Cela facilite également la gestion des interactions complexes dans votre jeu.


Voir aussi nos tutoriel :

Le choix de la base de données

Le choix de la base de données

Balise area

Définit une zone dans une image-carte

border-right-width

Définit la largeur de la bordure droite