Les Collisions en Pygame¶
Découvrez comment gérer les collisions en Pygame et faire interagir le joueur avec son environnement.
Dans cette page, on va voir comment :
- détecter des collisions
- créer des objets à éviter
- réagir quand le joueur les touche
Le principe des collisions¶
Pour l’instant, notre joueur est juste un rectangle qui se déplace librement.
Mais dans un jeu, on veut souvent savoir :
- est-ce que le joueur touche un mur ?
- est-ce qu’il touche un ennemi ?
- est-ce qu’il ramasse un objet ?
Pour ça, on va utiliser les Rect.
Collision entre deux rectangles¶
Pygame fournit une méthode très simple :
rect1.colliderect(rect2)
Elle renvoie :
Truesi les deux rectangles se touchentFalsesinon
Exemple :
if player_rect.colliderect(enemy_rect):
print("Collision !")
Créer un obstacle¶
On va créer un simple obstacle immobile :
enemy_rect = pygame.Rect(400, 250, 80, 80)
Et l’afficher :
pygame.draw.rect(screen, (255, 0, 0), enemy_rect)
Exemple complet : joueur + obstacle¶
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()
player_rect = pygame.Rect(100, 100, 50, 50)
enemy_rect = pygame.Rect(400, 250, 80, 80)
speed = 5
running = True
while running:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player_rect.x -= speed
if keys[pygame.K_RIGHT]:
player_rect.x += speed
if keys[pygame.K_UP]:
player_rect.y -= speed
if keys[pygame.K_DOWN]:
player_rect.y += speed
screen.fill((30, 30, 30))
pygame.draw.rect(screen, (0, 200, 255), player_rect)
pygame.draw.rect(screen, (255, 80, 80), enemy_rect)
if player_rect.colliderect(enemy_rect):
print("Collision !")
pygame.display.flip()
pygame.quit()
Si vous passez sur l’obstacle, “Collision !” s’affiche en boucle dans la console.
Réagir à une collision¶
Afficher un message, c’est bien, mais on peut faire mieux.
Par exemple, on peut :
- changer la couleur du joueur
- arrêter le jeu
- remettre le joueur au point de départ
Exemple :
if player_rect.colliderect(enemy_rect):
player_rect.x = 100
player_rect.y = 100
Plusieurs obstacles (listes)¶
En vrai, on ne veut pas qu’un seul obstacle.
On va donc utiliser une liste de rectangles :
enemies = [
pygame.Rect(300, 200, 60, 60),
pygame.Rect(500, 100, 60, 60),
pygame.Rect(200, 400, 60, 60),
]
Pour les afficher :
for enemy in enemies:
pygame.draw.rect(screen, (255, 80, 80), enemy)
Et tester les collisions :
for enemy in enemies:
if player_rect.colliderect(enemy):
print("Collision !")
Arrêter le jeu à la collision¶
On peut par exemple terminer la partie :
if player_rect.colliderect(enemy):
running = False
Ou créer une variable game_over (on verra ça plus proprement plus tard).
Quizz¶
for enemy in enemies:
if player_rect.colliderect(enemy):
print("Touché")
Que se passe-t-il si le joueur touche deux ennemis en même temps ?
- Le message s’affiche une seule fois
- *Le message peut s’afficher plusieurs fois
- Le programme plante
> La boucle teste chaque ennemi séparément. Si plusieurs collisions existent, le print est exécuté plusieurs fois.
Exercice pratique¶
Codez un programme où :
- Le joueur se déplace au clavier
- Il y a au moins 3 obstacles
- Chaque obstacle a une taille différente
- Si le joueur touche un obstacle : sa position est réinitialisée (ou le jeu s’arrête, au choix)
En résumé¶
Vous savez maintenant :
- Détecter une collision entre deux rectangles
- Créer des obstacles avec
pygame.Rect - Tester plusieurs collisions avec une liste
- Réagir à une collision