Aller au contenu

Structurer son code en Pygame

Jusqu’ici, tout notre jeu tenait souvent dans un seul fichier, avec beaucoup de code dans la boucle principale, et plein de variables différentes qui se baladent un peu partout.

Ça marche. Mais dès que le jeu grandit un peu, ça devient :

  • difficile à lire
  • difficile à modifier
  • facile à casser

Dans cette partie, on va apprendre à structurer proprement un jeu Pygame, sans non plus en faire trop.


Pourquoi structurer son code ?

Un code mal organisé, c’est :

  • du copier-coller
  • des bugs difficiles à comprendre
  • des modifications pénibles

Un code bien structuré, c’est :

  • plus clair
  • plus facile à faire évoluer
  • plus agréable à travailler

Le but ici n’est pas de faire un moteur professionnel, mais juste d’éviter le bazar.


Séparer le code en fichiers

On commence simple.

Au lieu d’un seul fichier main.py, on peut faire par exemple :

project/
├── main.py
├── player.py
├── enemy.py
└── settings.py

Chaque fichier a un rôle précis.


Exemple : fichier settings.py

On met dedans tout ce qui ne change pas souvent :

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
FPS = 60

PLAYER_SPEED = 5

Avantage :

  • une seule source de vérité
  • plus besoin de modifier des valeurs partout

Exemple de fichier player.py

On va introduire une classe, mais sans prise de tête.

import pygame
from settings import PLAYER_SPEED

class Player:
    def __init__(self):
        self.rect = pygame.Rect(100, 100, 50, 50)
        self.speed = PLAYER_SPEED

    def update(self, keys):
        if keys[pygame.K_LEFT]:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT]:
            self.rect.x += self.speed
        if keys[pygame.K_UP]:
            self.rect.y -= self.speed
        if keys[pygame.K_DOWN]:
            self.rect.y += self.speed

    def draw(self, screen):
        pygame.draw.rect(screen, (0, 200, 255), self.rect)

Ici :

  • la classe regroupe les données du joueur
  • et ce qu’il sait faire

Si vous ne savez pas comment fonctionne une classe, je vous recommande fortement de faire la partie "bases" du Parcours Programmation Objet Python.

En gros, retenez qu'une classe permet de regrouper :

  • des données (position, vitesse)
  • des comportements (bouger, dessiner)

Sans classe, tout serait mélangé dans main.py.

C'est vraiment un concept primordial quand on essaie de faire des jeux un peu gros.


Quizz

class Player:
    def __init__(self):
        self.x = 100
À quoi sert la méthode `__init__` ?
- À dessiner le joueur
- *À initialiser l’objet quand on le crée
- À détruire l’objet
- À mettre à jour le jeu
> `__init__` est appelée automatiquement quand on crée un objet avec `Player()`.

Exercice pratique

Réorganisez un de vos anciens jeux pour :

  1. Avoir au moins 3 fichiers (main.py, player.py, settings.py)
  2. Mettre les constantes dans settings.py
  3. Créer une classe Player
  4. Appeler update() et draw() depuis main.py

Bonus :

  • Ajoutez une classe Enemy
  • Ajoutez plusieurs ennemis avec une liste

En résumé

Vous savez maintenant :

  • Pourquoi structurer un jeu est important
  • Séparer le code en plusieurs fichiers
  • Utiliser une classe sans usine à gaz
  • Alléger la boucle principale
  • Écrire un code plus lisible et plus maintenable

À partir de maintenant, vos jeux vont commencer à ressembler à de vrais projets.