Détecter une collision simple (un joueur et un carré)

Commencer par la détection de collision avec un seul carré est parfait débuter.

    3ttr
  • Découverte

Maintenant que tu sais déplacer un personnage dans PyGame, voyons comment détecter si le joueur touche un objet à l’écran. On commence avec un seul objet : un carré doré qui représente une pièce à ramasser.


🎯 Objectif

  • Comprendre comment vérifier si le joueur touche un objet
  • Utiliser un rectangle invisible pour détecter la collision entre le joueur (image) et le carré (rectangle)

✅ Étape 1 : Créer un seul carré

On dessine un carré jaune à l’écran avec :

carre_x = 300
carre_y = 200
taille_carre = 20
couleur_carre = (255, 215, 0)

# Pour détecter une collision, on crée un rectangle :
carre_rect = pygame.Rect(carre_x, carre_y, taille_carre, taille_carre)

Ce rectangle représente la zone où la pièce est dessinée. Dans l'exemple du code précédent, on s'est contenté de dessiner un carré. Ici pour pouvoir détecter La collision avec le personnage, il faut enregistrer ce carré dans une variable pour effectuer nos tests plus tard.


✅ Étape 2 : Créer le rectangle du joueur

Même si le joueur est une image, on doit créer un rectangle invisible autour de lui avec :

player_rect = pygame.Rect(player_x, player_y, joueur_image.get_width(), joueur_image.get_height())

Ceci doit se faire dans la boucle. A chaque fois que le joueur a changé de position.


✅ Étape 3 : Tester la collision

On utilise la méthode .colliderect() pour savoir si les deux rectangles se touchent :

if player_rect.colliderect(carre_rect):
    print("Le joueur touche la pièce !")

🧪 Exemple complet avec un seul carré

Voici un petit jeu complet : un joueur (image) peut se déplacer et toucher un carré jaune. Quand c’est le cas, un message s’affiche dans la console.

import pygame
import sys

# Initialisation
pygame.init()

# Fenêtre
largeur_ecran = 800
hauteur_ecran = 600
screen = pygame.display.set_mode((largeur_ecran, hauteur_ecran))
pygame.display.set_caption("Collision simple")

# Joueur (image)
joueur_image = pygame.image.load("joueur.png")
player_x = 100
player_y = 100
vitesse = 5

# Taille du joueur (automatique via l’image)
player_largeur = joueur_image.get_width()
player_hauteur = joueur_image.get_height()

# Carré doré (pièce)
carre_x = 300
carre_y = 200
taille_carre = 20
couleur_carre = (255, 215, 0)

# Créer le rectangle du carré
carre_rect = pygame.Rect(carre_x, carre_y, taille_carre, taille_carre)

# Boucle de jeu
clock = pygame.time.Clock()
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # Gérer les touches
    touches = pygame.key.get_pressed()
    if touches[pygame.K_LEFT]:
        player_x -= vitesse
    if touches[pygame.K_RIGHT]:
        player_x += vitesse
    if touches[pygame.K_UP]:
        player_y -= vitesse
    if touches[pygame.K_DOWN]:
        player_y += vitesse

    # Créer le rectangle du joueur (à jour à chaque boucle)
    player_rect = pygame.Rect(player_x, player_y, player_largeur, player_hauteur)

    # Vérifier la collision
    if player_rect.colliderect(carre_rect):
        print("Le joueur touche la pièce !")

    # Affichage
    screen.fill((0, 0, 0))  # fond noir

    # Dessiner le carré doré
    pygame.draw.rect(screen, couleur_carre, carre_rect)

    # Dessiner le joueur
    screen.blit(joueur_image, (player_x, player_y))

    pygame.display.flip()
    clock.tick(60)

pygame.quit()
sys.exit()

🧠 À retenir

  • Tu peux détecter une collision entre un rectangle et une image grâce à pygame.Rect()
  • La méthode .colliderect() renvoie True si deux rectangles se touchent
  • Cette logique fonctionne même si le joueur est une image !

🔜 Prochaine étape

Tu es prêt à passer à :

  • plusieurs carrés à l’écran
  • supprimer un carré touché
  • compter les points

Pour aller plus loin