Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Pygame
  3. Les sprites avec Pygame
Extrait - Pygame Initiez-vous au développement de jeux vidéo en Python (2e édition)
Extraits du livre
Pygame Initiez-vous au développement de jeux vidéo en Python (2e édition)
1 avis
Revenir à la page d'achat du livre

Les sprites avec Pygame

La notion de sprite dans Pygame

La notion de sprite est fondamentale en développement de jeux vidéo et en particulier en développement Pygame. Lorsque l’on considère le développement d’un jeu vidéo, on s’aperçoit que l’on retrouve systématiquement un schéma récurrent qui est le suivant.

Celui-ci consiste à associer un emplacement de la fenêtre avec une représentation graphique et un ensemble de propriétés. Ceci est vrai tout le temps : pour des éléments du décor, pour les murs d’un labyrinthe, pour les personnages, le héros ou l’héroïne, les ennemis divers, et de manière générale pour tout élément graphique du jeu. C’est évidemment vrai pour les objets manipulés au cours du scénario du jeu. Par exemple, des armes, des objets manipulés par les personnages ou encore le ballon d’un jeu sportif.

On peut donc envisager un sprite comme un objet qui associe un emplacement, une représentation graphique (telle ou telle image, par exemple) et un ensemble de propriétés. Ces propriétés peuvent être un nom, un texte, des booléens qui caractérisent l’objet en question (par exemple, l’objet peut-il se déplacer ou non).

Une traduction pertinente du terme « sprite » pourrait d’ailleurs être « image-objet » (au sens programmation orientée objet) que l’on met à jour à chaque itération de la boucle de jeu. Mais plus le jeu est complexe, plus il compte un nombre important d’objets graphiques à gérer et à mettre à jour, ce qui peut être fastidieux. C’est pourquoi Pygame formalise non seulement la notion de sprite, mais également...

La notion de group dans Pygame

Manipuler des sprites permet, d’une part, de ne pas « réinventer la roue » à chaque nouveau programme, mais également d’être plus efficace dans le développement grâce à une autre notion : celle de group. Un group est une collection de sprites. Ainsi, on peut appliquer un traitement donné à un ensemble de sprites ou à un sous-ensemble de sprites : par exemple, changer la couleur de tous les ennemis, rendre invisibles des éléments de décor d’un certain type. Les possibilités sont infinies. Surtout, en une ligne dans la boucle de jeu, on peut mettre à jour un grand nombre de sprites d’un seul coup.

Une gestion des collisions simplifiée

Par ailleurs, avoir ainsi la maîtrise sur l’ensemble des sprites du jeu, et donc sur l’ensemble des objets graphiques du jeu, permet d’offrir une gestion des collisions particulièrement simplifiée.

Mais qu’est-ce que la gestion des collisions ? C’est la gestion de la rencontre géométrique de deux objets graphiques. Par exemple, la fusée dans le chapitre Concepts du jeu vidéo et premiers pas à propos de Pygame n’est pas autorisée à dépasser les bords lors de son déplacement latéral. Si on simule le rebond d’un ballon sur le sol, la rencontre entre le sol et le ballon est une collision qu’il convient de gérer.

Autre exemple, un objet graphique relatif à un personnage peut se saisir d’un objet. La rencontre entre le personnage et l’objet à saisir est une collision ; comme celle entre une héroïne et un ennemi qu’il s’agit de combattre.

Ainsi, au travers des notions de sprite et de group, Pygame propose plusieurs fonctions qui facilitent la gestion des collisions. Ces fonctions sont un des principaux sujets d’étude du présent chapitre.

Quelques explications sur la programmation orientée objet

1. Le paradigme objet, les grandes lignes

L’idée première de la programmation objet est de justement manipuler des objets qui représentent un concept issu de la réalité ou non. On peut par exemple chercher à représenter une voiture. On peut considérer qu’une voiture, c’est avant tout une immatriculation, une couleur de carrosserie et un nombre de portières (trois ou cinq portes). On s’intéresse également au fait que la voiture roule ou non. On peut donc voir le concept de voiture comme quelque chose qui unifie une chaîne de caractères (immatriculation), une seconde chaîne de caractères (couleur), une valeur entière (nombre de portes) et un booléen qui indique si la voiture est en train de rouler ou non. On considère enfin que le véhicule possède deux actions : avancer (rouler) et s’arrêter.

Ce concept unifiant regroupant les propriétés (immatriculation, couleur, etc.) et les actions possibles (avancer, s’arrêter) est celui de classe. On est ici en train de définir la Voiture.

Les propriétés qui caractérisent la classe Voiture (immatriculation, couleur, etc.) s’appellent des attributs.

Une action comme s’arrêter ou avancer de la classe Voiture est une méthode. Une méthode n’est ni plus ni moins qu’une fonction définie dans une classe. Il faut donc « être » une instance de ladite classe pour pouvoir l’appeler.

Une classe est donc un concept unifiant regroupant une collection d’attributs et de méthodes. Mais pour le moment, on n’a que le modèle, le moule de ce que représente une voiture, c’est-à-dire la classe Voiture.

Il faut à présent...

Le module sprite et son utilisation

1. Le contenu du module sprite

Dans le module sprite se trouve la classe Sprite ainsi que la classe Group et un certain nombre de déclinaisons de la classe Group. Pour rappel, les classes de type Group constituent des collections d’objets Sprite, avec des manières différentes de les ranger et de les utiliser.

Une documentation du module sprite de Pygame est disponible dans le chapitre Les principaux modules Pygame. Elle détaille le contenu des classes Sprite et Group.

2. Création d’un sprite

a. Premier exemple d’utilisation

Pour illustrer la création et l’utilisation d’un sprite, nous allons reprendre l’exemple du chapitre La structure d’un jeu Pygame, qui consiste à faire rebondir un carré sur les bords latéraux de la fenêtre de jeu.

On commence par créer une classe CARRE qui hérite de pygame.sprite.Sprite.

class CARRE(pygame.sprite.Sprite): 

À l’intérieur de cette classe, on définit un initialiseur dont la première action est de faire un appel explicite à l’initialiseur de la classe mère. Ainsi, les instances de la classe CARRE bénéficieront des caractéristiques de la classe mère.

def __init__(self): 
 pygame.sprite.Sprite.__init__(self) 

Puis on complète la définition de l’initialiseur en définissant la surface relative à la forme géométrique, sa couleur de fond, ses dimensions et sa position initiale (au centre de la fenêtre de jeu).

Comme la classe CARRE hérite de la classe pygame.sprite.Sprite, elle hérite aussi de ses attributs qui permettent de définir la surface (attribut image) et le positionnement de cette surface (attribut rect).

On définit également un attribut DEPLACEMENT qui représente le déplacement...

Conclusion du chapitre

On a maintenant toutes les connaissances pour créer des jeux ambitieux : les aspects graphiques, le son et, avec ce chapitre, la gestion des collisions. Nous pouvons donc passer au développement de jeux vidéo élaborés en Pygame, ce qui est l’objet du chapitre suivant.