Python, création d’un jeu avec Pygame

Envie de vous lancer dans la création d’un jeu avec Pygame, servez-vous de cette structure pour éditer votre propre jeu en 2D.Vous avez peut-être déjà vu sur ce site l’un de ces articles :

Ou même sur internet mais vous n’avez pas été convaincu par ce que vous avez li ou bien les exemples n’étaient pas suffisamment détaillés, alors cette article est fait pour vous.

Vu la taille du script, je ne rentre pas en détails dans chaque fonctions utilisées mais des commentaires sont présents pour vous guider. Certains point sur lesquels sur lesquels vous avez des questions seront un peu plus détaillées. N’hésitez pas à poser des questions dans les commentaires.

Le jeu

Ce qu’il y a

Le jeu que je me suis amusé à faire un un SpaceInvader Like, nous avons donc un vaisseau que nous pouvons contrôler avec les flèches directionnelles, il tire de simples projectiles avec la barre d’espace.

Des ennemis apparaissent de manières aléatoire, les points dépendent de la taille des vaisseaux, les dégâts infligés à votre vaisseau dépendent aussi de la taille des vaisseaux ennemi.

Les collisions sont prisent en compte.

La santé, la vie et le niveau augmentent au fur et à mesure.

Il se joue dans une fenêtre de 640 par 480 pixels.

Ce qu’il n’y a pas

Alors oui, on va dire que le jeu n’est pas fini (ou pas complet) mais cela de manière intentionnelle :

pour des sons, des images, des ressources, vous pouvez vous rendre sur cet site très intéressant : opengameart.org.

Mais pourquoi ? Tout simplement pour garder un code les plus simple possibles (certainement avec des améliorations ou optimisations, je ne suis qu’un débutant) pour qu’il soit facilement récupérable dans vos scripts.

Où trouver le jeu

Je n’ai pas mis le fichier en téléchargement sur cette page mais si vous vous lancez dans ce projet, peut-être devriez-vous jeter un petit coup d’oeil sur cette page. Pour obtenir les fichiers du jeu, rendez-vous sur cette page : le dépôt de mon jeu.

Quelques images (toutes moches)

Alors pour les explications, en vert, c’est vous, en rouge, les méchants et les tirs sont en bleu.

Python faire votre jeu avec Pygame, page accueil
Python faire votre jeu avec Pygame, page accueil
Python faire votre jeu avec Pygame, page jeu
Python faire votre jeu avec Pygame, page jeu

Je ne vous ai pas menti, rien de transcendant.

Explications du script

Comme dit plus haut, vous pouvez récupérer le script ici : le dépôt de mon jeu.

Si il y a des points précis sur lesquels vous voulez des explications, n’hésitez pas à le dire dans les commentaires, je mettrai à jour l’article en même que je réponds.

Les fichiers

Vous trouverez 4 fichiers :

  • main.py (lien), il contient la trame principal
  • accueil.py (lien), il contient la gestion de la page d’accueil
  • constantes.py (lien), il contient les variable ou fonctions, classes qui peuvent être utilisé dans plusieurs fichiers
  • jeu.py (lien), il contient le jeu en lui-même

Fichier constantes.py

Le fichier est actuellement très petit, il y a très peu de pages, peu de personnalisation, il pourrait très bien y avoir les différentes font, les liens vers les images, les fond, la création des objets de musiques.

# coding: utf-8

import pygame
from pygame.locals import *

pygame.init()

noir = (0,0,0)
blanc = (255,255,255)
selection = (100,100,100)
font = pygame.font.init()
font_accueil = pygame.font.Font(None,20)

On y retrouve, l’encodage, les importations et l’initialisation de pygame.init()

Fichier main.py

Il s’agit du fichier qui devra être appelé pour lancer le jeu, par exemple sur Linux : python3 ./main.pysi on se trouve dans le dossier du fichier.

On y retrouve les imports, l’encodage, l’initialisation de la fenêtre et :

# Initialisation de la page d'accueil
accueil = accueil.gestion_accueil(fenetre)
partie = jeu.gestion_jeu(fenetre)

# Initialisation des valeurs pour les boucles
fenetre_jeu = True

while fenetre_jeu:
  accueil.run() # affichage de l'écran d'accueil, tant qu'aucun choix n'y est fait, on ne sors pas
  partie.run() # Lancement de la partie
  partie = jeu.gestion_jeu(fenetre) # réinialisation de la partie avec défaite ou recommencer

Rien de très compliqué, dans la bouche while, on va venir afficher l’accueil, lorsque le choix sera fait, on affichera la partie, en fin de partie, on recrée une partie.

Fichier accueil.py

Comme pour les deux précédents, on retrouve, l’encodage, les imports. L’importation de sys permet de gérer la sortie du jeu.

Il n’y a pas de piège, si vous avez des questions, n’hésitez pas à le dire dans le commentaire.

Fichier jeu.py

Je ne savais pas trop quels points présentés, je vous invite donc à poser des questions directement dans les commentaires

Le plus gros des scripts, on y retrouve, l’encodage, les imports :

# coding: utf-8

import pygame, sys, constantes, time, random
from pygame.locals import *
  • time, permet de prendre en compte le temps dans le script (délai entre deux tirs, invulnérabilité après collision ou tir ennemi, perte de vie)
  • random : permet de générer des ennemis de manière aléatoire avec des formes plus ou moins grandes (influences sur les points et les dégâts)

la fonction run de la classe gestion_jeu contient notre boucle principale :

  • la gestion des évènements clavier (y compris la gestion de la boucle de pause)
  • la mise à jours et l’affichage des balles du vaisseau et ennemi
  • création des ennemis et des tirs ennemis
  • la mise à jour de la position du vaisseau et des vaisseaux ennemi
  • la gestion des collisions vaisseau et vaisseaux ennemis et de la collision avec les tirs
  • l’affichage des différentes informations à l’écran
  • l’invulnérabilité
  • le game-over
Les points importants

Les ennemis et tirs, après être créés sont placés dans des listes, à chaque tour de boucle, on vient parcourir ses listes pour gérer les déplacements, lorsque qu’il y a une collisions ou bien que l’on sort de l’écran, c’est objets sont placés dans une secondes liste pour être supprimés en fin de boucle.

Les collisions sont gérées avec cette fonction conditions : if ennemi.rect.colliderect(self.vaisseau.rect) :(cas d’une collision entre un vaisseau ennemi et votre vaisseau).

Nous retrouvons en fin de fichiers plusieurs classes :

  • tir_simple : pour la création des tirs de votre vaisseau ainsi que la modification de la position des tirs
  • tir_ennemi_simple , pareil mais pour les tirs ennemis, il y a une prise en compte du niveau pour les dégâts occasionnés
  • nouvel_ennemi, permet de créer un nouvelle ennemi avec une taille différentes qui influencera ses dégât et les points rapportés. Sa vitesse sera fonction du niveau du jeu en cours.
  • vaisseau, il s’agit des caractéristiques de votre vaisseau, on y modifie le niveau, la santé, la vie et sa position.

Les évolutions possibles

Le jeux n’est vraiment pas beau comme il est, mais il est très simple d’ajouter des éléments du décor (étoile, planète) qui apparaissent de manière aléatoires, vous pouvez facilement ajouter du son, de la musiques ainsi que des petites animations.

N’hésitez pas à poster vos codes ou adresse de dépôt de votre jeu.

Conclusion

Vous êtes prêts pour faire un petit jeu, c’est très intéressant de commencer par un projet simple et sans tout pleins de trucs qui peuvent perturber la compréhension de la mécanique de création du jeu. Si vous avez des question, n’hésitez pas à les poser, je ferai en sorte d’y répondre le plus rapidement possible.

Laisser un commentaire