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 :
- Avoir au moins 3 fichiers (
main.py,player.py,settings.py) - Mettre les constantes dans
settings.py - Créer une classe
Player - Appeler
update()etdraw()depuismain.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.