Aller au contenu

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 :

  • True si les deux rectangles se touchent
  • False sinon

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ù :

  1. Le joueur se déplace au clavier
  2. Il y a au moins 3 obstacles
  3. Chaque obstacle a une taille différente
  4. 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