Créer des jeux vidéo avec Pygame
Introduction
1. Contexte
Dans la plupart des langages de programmation, des fonctions permettent d’interagir avec le clavier, voire la souris. Mais dès qu’il s’agit de produire un son, d’effectuer des affichages à 30 images par seconde ou d’utiliser le joystick, nous sommes face à un grand vide. La cause profonde vient du contexte historique. En effet, ces besoins correspondent essentiellement à ceux de l’industrie du jeu vidéo. Par conséquent, des librairies spécialisées (OpenGl, DirectX) et des environnements dédiés (Unity3D, Unreal Engine…) proposent des packages spécifiques pour gérer la 3D, la 2D, les animations, les effets spéciaux, les interactions avec les joysticks, la gestion des Kinect ou des casques de réalité virtuelle…
En fait, pendant longtemps, l’offre s’est centrée autour de la librairie SDL (Simple DirectMedia Library) permettant un contrôle de l’audio, du clavier, de la souris, du joystick et de la carte 3D. Effectivement, proposée comme une surcouche de DirectX et d’OpenGL, cette librairie pouvait penser offrir une forme de simplicité, comparée à ces deux mastodontes destinés aux développeurs de haut niveau.
Malheureusement, SDL étant proposée en langage C, sans environnement de développement dédié, son utilisation avec les fameux pointeurs du langage C a dérouté plus d’un utilisateur. Développer un jeu très simple relevait du défi personnel dans ce contexte et mieux valait ne pas s’y aventurer sans une aide extérieure.
Heureusement, la librairie SDL a été portée sous Python, donnant naissance à Pygame. Ainsi, nous avons accès quasiment à la même puissance graphique que les librairies DirectX et OpenGL, sans toutefois avoir accès à toutes les options de dernière génération, mais nous n’en sommes pas à ce niveau-là pour l’instant ! Nous contournons cependant cette fois l’utilisation des pointeurs et la gestion de la mémoire bas niveau propre au langage C et cela fait beaucoup de travail difficile, chronophage et d’intérêt faible qui disparaît. Nous pouvons donc avec le temps disponible...

1. Présentation du code
Vous pouvez trouver la source du projet à compléter en téléchargement sur le site de l’éditeur sous le nom de fichier : Pygame Premiers pas.py.
Recopiez le code suivant dans votre éditeur ou téléchargez et ouvrez le fichier Premier pas.py.
# permet d'accéder aux fonctions du module pygame
import pygame
# Definit des couleurs RGB
BLACK = [0, 0, 0]
WHITE = [255, 255, 255]
GREEN = [0, 255, 0]
RED = [255, 0, 0]
BLUE = [0 , 0 , 255]
# initialisation de l'écran de jeu
pygame.init()
# Initialise la fenêtre de jeu
TailleEcran = [400, 300]
screen = pygame.display.set_mode(TailleEcran)
pygame.display.set_caption("Super Ball")
# Gestion du rafraîchissement de l'écran
clock = pygame.time.Clock()
# Position de départ
balle_x = 50
balle_y = 50
# Vitesse et direction
balle_change_x = 3
balle_change_y = 3
balle_rayon= 5
# Le jeu continue tant que l'utilisateur ne ferme pas la fenêtre
Termine = False
# BOUCLE PRINCIPALE DU PROGRAMME
while not Termine:
# recupère la liste des évènements du joueur
event = pygame.event.Event(pygame.USEREVENT)
# ÉVÈNEMENTS
# détecte le clic sur le bouton close de la fenêtre
for event in pygame.event.get():
if event.type == pygame.QUIT:
Termine = True
# LOGIQUE
# Déplace la balle
balle_x += balle_change_x
balle_y += balle_change_y
# Rebond
if balle_y > TailleEcran[1] or balle_y < 0:
balle_change_y = balle_change_y * -1
if balle_x > TailleEcran[0] or balle_x < 0:
balle_change_x = balle_change_x * -1
# AFFICHAGE
# Dessine le fond
screen.fill(WHITE)
# Colorie les bords de l'écran
R = [0,0, TailleEcran[0], TailleEcran[1]]
pygame.draw.rect(screen,GREEN,R ,1)
# dessine le palet de jeu
pygame.draw.circle(screen,RED,[balle_x,balle_y],balle_rayon...
1. Historique
Pong est un des premiers jeux vidéo d’arcade à avoir connu un succès planétaire. Il a été imaginé par l’américain Nolan Bushnell. La société Atari le commercialise en 1972 sous forme de bornes d’arcade, vendant environ 8 000 exemplaires en un an. Le succès étant au rendez-vous, en 1975, Pong est vendu sous forme de consoles de salon. Les consoles Atari ainsi que celles mises en place par la concurrence sous forme de contrefaçons ou de variantes vont totaliser plusieurs millions de ventes les années suivantes, c’est une véritable explosion. On peut considérer que ce succès mondial doublé par la production en masse de consoles a été le point de départ de l’industrie du jeu vidéo.
Le jeu est inspiré du tennis de table en vue de dessus. Les deux joueurs s’affrontent en déplaçant chacun son palet placé sur les bords gauche et droit. La balle rebondit sur le bord supérieur et inférieur de l’écran, et chaque fois qu’elle sort du côté gauche ou du côté droit, le joueur correspondant marque un point. Le score est affiché en haut de l’écran, au centre. La simplicité du jeu et son gameplay réussi contribuent au succès du titre.
2. Premier lancement
Vous pouvez trouver la source du projet à compléter en téléchargement sur le site de l’éditeur sous le nom de fichier : Pygame Pong.py.
Ouvrez le fichier Pong.py dans votre éditeur de code Python et lancez le programme. Vous constatez qu’une petite partie du jeu est déjà fonctionnelle. La balle se déplace, le palet de gauche peut être contrôlé à partir des touches [Flèche en haut] et [Flèche en bas] et la balle peut rebondir dessus. En revanche, elle rebondit uniquement sur le mur du haut, et non sur le mur du bas !

Dans les fichiers d’exemple se trouve la correction du projet si vous êtes vraiment coincé.
3. Présentation du code
Vous remarquerez que la moitié des lignes de code sont comparables à celles du jeu précédent. Pourquoi ? Car il y a beaucoup de points communs : variables définissant...


1. Historique
Snake (de l’anglais signifiant "serpent") est un genre de jeu vidéo dans lequel un joueur dirige un serpent qui grandit au cours de la partie. Lui et ses éventuels congénères constituent ainsi un obstacle pour eux-mêmes. L’objectif est de survivre le plus longtemps possible en ramassant éventuellement des bonus pour augmenter son score.
Il n’existe pas vraiment une version de référence pour ce jeu. En effet, son graphisme ultrasimple, son absence de musique et son fond d’écran noir ne permettent pas de lui donner une personnalité, comparativement à des jeux comme Pacman ou Tetris. De plus, ce concept est déclinable dans des versions très différentes, comme Tron. Presque disparu de la communauté vidéo ludique dans les années 2000, il est redevenu un classique grâce aux appareils mobiles.
2. Premier lancement
Vous pouvez trouver la source du projet à compléter en téléchargement sur le site de l’éditeur sous le nom de fichier : Pygame Snake.py.
Le corrigé du projet est aussi disponible en téléchargement sous le nom de fichier : Pygame Snake corrigé.py.
Ouvrez le fichier Pygame Snake.py dans votre éditeur de code Python et lancez le programme. Vous constatez qu’une petite partie du jeu est déjà fonctionnelle. Le serpent se déplace sur la droite, sa tête est affichée en blanc, et son corps en jaune. Le score affiché augmente au fil du temps.

Dans les fichiers d’exemple se trouve la correction du projet si vous êtes coincé.
3. Présentation du code
Nous ne présentons pas la boucle principale de jeu de Pygame. Si besoin, référez-vous à la section Le projet balle rebondissante en début de chapitre.
Choisir comment programmer le serpent n’est pas chose aisée. En effet, celui-ci doit pouvoir s’allonger et, de plus...
La documentation en ligne de Pygame
Comment connaître les différents paramètres des fonctions de la librairie Pygame ? À ce niveau-là, il n’y a pas beaucoup d’options. Vous pouvez demander sur un forum ou plus rapidement consulter la documentation en ligne. La documentation de la librairie Pygame est plutôt bien faite. Cependant, elle est disponible uniquement en anglais. Ce n’est pas un obstacle normalement, car les documentations techniques informatiques utilisent une grammaire et un vocabulaire assez simples. En revanche, il y a des termes techniques, et là, ce n’est pas évident. Car ces termes ne sont pas forcément présents dans un dictionnaire anglais-français, vu la spécificité de la matière.
Il se peut d’ailleurs qu’il n’existe pas de mot équivalent en français et que le terme anglais soit ainsi utilisé couramment par la communauté. Dans ce cas, il faut trouver une source d’explication. Par exemple, Wikipédia connaît très bien les termes techniques. Nous allons vous présenter ici les termes spécifiques à la librairie Pygame et nous essaierons de décrypter une partie de la documentation concernant les fonctions de dessin.
Si vous n’êtes pas à l’aise en anglais, ce n’est pas grave : toute l’information nécessaire pour compléter les projets est donnée dans le livre.
1. La liste des termes techniques
-
Width : largeur.
-
Height : hauteur.
-
Draw : dessiner.
-
Straight line : ligne droite.
-
Render : dessiner dans un sens plus général que draw. On peut dire que draw concerne plutôt les tracés géométriques : cercle, droite, rectangle... et render englobe la totalité des opérations graphiques, comme le dessin, mais aussi les effets spéciaux.
-
Rendering : étape durant laquelle l’ordinateur effectue toutes les opérations...


1. Historique
En 1985, la société Atari Games édite la borne d’arcade Gauntlet, borne révolutionnaire pour l’époque, car plusieurs joueurs, quatre exactement, peuvent coopérer pour évoluer à l’intérieur d’un donjon rempli de trésors, de monstres et de nombreux pièges en tout genre. Gauntlet fait aujourd’hui partie des classiques des jeux d’action et le jeu a d’ailleurs été porté sur de nombreux micro-ordinateurs. Cerise sur le gâteau, en vous plongeant dans un monde digne de Donjons et Dragons, vous avez le choix d’incarner quatre personnages différents : un guerrier, un mage, un elfe ou une valkyrie. Chacun a une arme ou un pouvoir différent avec des caractéristiques spécifiques. L’interface en vue de dessus permet d’avoir une bonne vision du décor et des méandres du labyrinthe dans lequel les joueurs sont plongés.


Gauntlet sur borne d’arcade Atari et sa version portée sur micro-ordinateur
Nous vous proposons de mettre en place les bases d’un jeu fonctionnant avec le même concept : un aventurier évoluant dans un labyrinthe à la recherche de clefs et de trésors.
Vous trouverez les exemples de code dans le fichier : Labyrinthe.py.
2. Gestion du labyrinthe
Nous stockons le plan du labyrinthe à l’intérieur d’une liste de string :
LABY = [ 'BBBBBBBBBB',
'B B',
'B BB BBBBB',
'B B B B',
'B BB BB B',
'B B BB B',
'B B B B',
'BB BB BB B',
'B B B',
'BBBBBBBBBB' ]
Ce choix technique est en fait orienté par la pratique. En effet...



1. Historique

Voici un titre célèbre de la société Capcom, sorti en 1987. Le joueur pilote un avion au-dessus du Pacifique en pleine guerre du Japon. Il se trouve confronté à des vagues d’ennemis. Les cuirassés et notamment leurs tourelles anti-aériennes l’obligent à mener une lutte acharnée pour mener à bout chaque niveau. Le game design basé sur un défilement vertical est des plus simple. Quant aux missions, elles consistent à détruire le boss de fin de niveau, ce qui n’est pas particulièrement original. Cependant, la simplicité du jeu et l’originalité des décors lui ont procuré un certain succès, à tel point que le titre a été distribué sur l’ensemble des consoles et des micro-ordinateurs de l’époque.
Vous pouvez trouver la source du projet à compléter en téléchargement sur le site de l’éditeur sous le nom de fichier : Pygame 1943.py.
Le corrigé du projet est aussi disponible en téléchargement sous le nom de fichier : Pygame 1943 corrigé.py.
2. Premier lancement
Téléchargez et ouvrez le fichier 1943.py dans votre éditeur de code Python et lancez le programme. Vous constatez qu’une petite partie du jeu est déjà fonctionnelle. L’avion se déplace ! Le cuirassé aussi, mais il ne semble pas très réactif. La mer défile sous l’avion, cela donne un effet de vitesse. Étrangement, elle disparaît petit à petit. Bref, vous l’avez compris, il y a du travail en perspective !
![]() |
![]() |
3. Gestion de la mer
Nous ne présentons plus la structure de boucle d’un jeu sous Pygame. Si vous ne la connaissez pas, reportez-vous au projet : Le projet balle rebondissante de ce chapitre.
MER = pygame.Surface((LARG, HAUT))
pygame.draw.rect(MER, BLEU, [0,0,LARG,HAUT])
for i in range(2000) :
x = random.randint(0,LARG-1)
y = random.randint(1,HAUT-1)
MER.set_at((x, y), BLANC)
Pour gérer la mer, nous créons une surface (une image) de la taille de la fenêtre de jeu. Nous la remplissons de bleu. Ensuite, nous tirons aléatoirement des coordonnées pour positionner des pixels...


1. Contexte
Vous pouvez trouver la source du projet à compléter en téléchargement sur le site de l’éditeur sous le nom de fichier : Pygame Illumination.py.
Le corrigé du projet est aussi disponible en téléchargement sous le nom de fichier : Pygame Illumination corrigé.py.
Nous vous proposons de mettre en place une démonstration graphique. Le but de ce projet consiste à simuler l’éclairage d’une pièce. Le problème sous-jacent est celui du lancer de rayon. Ce problème est la base du graphisme en 3D. Les images de synthèse que vous voyez au cinéma et les jeux sur console exploitent largement cette technique.
Le lancer de rayon est aussi utilisé dans la gestion des interactions des jeux, par exemple pour savoir si un drone peut détecter votre présence ou pour savoir si votre tir a touché sa cible ou s’il a été arrêté par un obstacle. Le lancer de rayon consiste à envoyer une sorte de rayon laser depuis une source et à déterminer quel objet est touché par ce rayon.
Pour notre simulation, nous disposons une source de lumière en bas de l’écran, qui se déplace de gauche à droite. Nous ajoutons des murs dans la scène. Comme nous affichons le terrain en vue de dessus, ces murs apparaissent sous la forme de segments vus d’en haut. Leur rôle consiste à arrêter les trajets des rayons lumineux. Depuis la lampe, nous faisons partir une multitude de rayons et nous affichons leurs trajets jusqu’à ce qu’ils rencontrent un point d’impact. Voici un exemple de rendu :



2. Rappels mathématiques
Pour ce projet, nous devons calculer l’intersection entre un rayon lancé depuis une source et un segment qui symbolise notre mur. Nous allons travailler en 2D, ce qui va simplifier nos calculs. Le point L définit la position de la source de lumière, le point P définit un point éloigné indiquant la direction du rayon, et les points M et K définissent les extrémités d’un mur. Voici un schéma qui résume la situation :




1. Historique
Vous pouvez trouver la source du projet à compléter en téléchargement sur le site de l’éditeur sous le nom de fichier : Pygame Tetris.py.
Le corrigé du projet est aussi disponible en téléchargement sous le nom de fichier : Pygame Teris corrigé.py.
Tetris est un jeu vidéo entre arcade et puzzle, conçu par Alekseï Pajitnov en juin 1984. Le succès devient planétaire et toutes les consoles qui suivront posséderont leur version de Tetris. Il fait partie des jeux les plus addictifs de l’époque, avec Pacman. Le jeu consiste, grâce à seulement quatre touches, à orienter une pièce à droite ou à gauche pendant que cette dernière tombe inexorablement vers le bas de la grille. On peut aussi la faire tourner sur elle-même ou accélérer sa descente. Une fois la pièce bloquée, on ne peut plus modifier sa position et une autre pièce arrive en haut du décor. Et au grand désarroi du joueur, ce n’est jamais celle qu’il attend ! Ses ennemis sont les trous qu’il laisse au fur et à mesure de ses empilements maladroits. Cependant, lorsqu’une ligne est complète, elle disparaît et les lignes supérieures descendent alors d’un étage, laissant au joueur un espoir de survie supplémentaire ! Le jeu s’arrête lorsqu’une pièce nouvelle est bloquée dès son arrivée. Voici des copies d’écran de Tetris sur diverses machines de l’époque :

Sur GameBoy 1989 Sur AtariST 1989 Sur PS1 1994
2. Premier lancement
Téléchargez et ouvrez le fichier Pygame Tetris.py dans votre éditeur de code Python et lancez le programme. Vous constatez qu’une petite partie du jeu est déjà fonctionnelle. Une pièce apparaît, elle descend, descend, mais il est impossible de la déplacer :

3. Présentation du code
Nous ne présentons plus la structure de boucle d’un jeu sous Pygame. Si vous ne la connaissez...

