Le dessin et le graphisme dans tous leurs états avec Pygame
Introduction
Nous avons vu dans les chapitres précédents les bases de Pygame et notamment la gestion de la boucle de jeu. Des concepts importants comme la gestion des collisions ont pour le moment été laissés de côté : en effet, quand nous souhaitons détecter la rencontre d’un objet avec un autre (comme pour l’object rebondissant), nous l’avons géré par calcul géométrique. Pygame permet bien plus à ce niveau et nous l’étudierons évidemment par la suite.
Dans le présent chapitre, nous allons détailler quelque chose que nous avons un petit peu abordé déjà, les aspects graphiques. Ils sont en effet fondamentaux en développement de jeux vidéo. Le propos de ce chapitre est donc d’aller aussi loin que possible à propos du dessin en Pygame. Par dessin, on entend ici le tracé de formes géométriques : carrés, rectangles, lignes, arcs de cercle, polygones, ellipses, etc.
En effet, nous allons avoir besoin de ces formes plus ou moins élémentaires pour agrémenter le visuel des jeux et parfois pour définir des éléments du jeu lui-même. Par exemple, des lignes peuvent constituer la représentation graphique de murs d’un labyrinthe duquel un joueur cherche à sortir.
Nous étendrons par ailleurs notre propos au graphisme en général en Pygame, en nous intéressant à l’affichage des images, des zones de texte, etc. Et donc, à ce titre, nous chercherons à creuser la notion de manipulation de surfaces en Pygame, introduite au chapitre La structure d’un jeu Pygame.
Enfin, seront présentées les différentes transformations géométriques possibles avec Pygame.
Dessiner des formes avec Pygame
1. Le module pygame.draw
Ce module Pygame permet de dessiner les principales formes géométriques dont on peut avoir besoin. Notamment, les formes suivantes :
-
une ligne, à l’aide de la fonction pygame.draw.line
-
une ligne brisée, à l’aide de la fonction pygame.draw.lines
-
un rectangle, à l’aide de la fonction pygame.draw.rect
-
un polygone, à l’aide de la fonction pygame.draw.polygon
-
un cercle, à l’aide de la fonction pygame.draw.circle
-
une ellipse, à l’aide de la fonction pygame.draw.ellipse
-
un arc de cercle ou d’ellipse, à l’aide de la fonction pygame.draw.arc
Une documentation du module draw de Pygame est disponible dans le chapitre Les principaux modules Pygame.
2. Dessiner une ligne
Commencez par colorer en noir le fond de la fenêtre du jeu. Puis, tracez les deux diagonales du carré de la fenêtre de jeu. Les deux diagonales sont colorées en rouge. Géométriquement, ce sont des segments.
Comme vu précédemment, utilisez la fonction pygame.draw.line. Le code est le suivant :
import pygame, sys
pygame.init()
# FENETRE DE 400 SUR 400 AVEC UN FOND NOIR
ECRAN = pygame.display.set_mode((400,400))
pygame.display.set_caption("Chapitre 5")
COULEUR_NOIRE = pygame.Color(0, 0, 0)
ECRAN.fill(COULEUR_NOIRE)
# DIAGONALES EN ROUGE
COULEUR_ROUGE = pygame.Color(255, 0, 0)
pygame.draw.line(ECRAN, COULEUR_ROUGE, (0,0), (400, 400))
pygame.draw.line(ECRAN, COULEUR_ROUGE, (0, 400), (400, 0))
# BOUCLE DE JEU
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pygame.display.flip()
C’est précisément le code suivant qui permet d’afficher...
Afficher et sauvegarder des images avec Pygame
1. Le module pygame.image
La question du chargement et de l’affichage des images a été abordée dans le chapitre Concepts du jeu vidéo et premiers pas à propos de Pygame avec l’exemple Fusée et planètes. Il s’agit donc de préciser un peu tout cela. En effet, l’élaboration d’un jeu implique souvent d’afficher des images élémentaires. Par exemple, l’image élémentaire du mur d’un labyrinthe que l’on va afficher en de multiples exemplaires.
Pygame propose un module nommé image dédié à l’affichage et à la sauvegarde des images. Les fonctions disponibles dans ce module sont les suivantes :
-
pygame.image.load : charge et affiche une image externe.
-
pygame.image.save : enregistre une image issue de Pygame dans un fichier.
-
pygame.image.get_extended : teste préalablement à l’affichage si le chargement et l’affichage par Pygame sont possibles.
-
pygame.image.tostring : crée un buffer de chaîne de caractères représentant l’image.
-
pygame.image.fromstring : crée une surface de type image depuis un buffer de chaîne de caractères.
-
pygame.image.frombuffer : crée une surface de type image depuis un buffer.
Un buffer en informatique est une mémoire tampon dynamique qui permet de stocker temporairement de l’information.
Une documentation du module image de Pygame est disponible dans le chapitre Les principaux modules Pygame.
2. Charger des images avec Pygame
a. La fonction pygame.draw.load
La fonction pygame.image.load permet de charger une image stockée sur un ordinateur, par exemple. Les extensions autorisées sont les suivantes :
-
JPG
-
PNG
-
GIF (quand ce n’est pas un GIF dit animé)...
Utiliser et manipuler du texte dans Pygame
1. Le module pygame.font
L’affichage de chaînes de caractères et donc de texte en Pygame obéit à la même logique que celle utilisée pour les formes géométriques ou les images : celle des surfaces Pygame. Ici également, il s’agira d’écrire du texte sur une surface donnée.
L’enjeu principal de l’affichage de texte est celui de la police de caractères (font en anglais). Le module dédié dans Pygame s’appelle pygame.font.
Les principales fonctions de ce module sont les suivantes :
-
pygame.font.get_default_font : obtient le nom du fichier de la police de caractères par défaut.
-
pygame.font.get_fonts : obtient toutes les polices de caractères disponibles.
-
pygame.font.match_font : recherche une police de caractères portant un nom donné.
-
pygame.font.SysFont : crée un nouvel objet « police de caractères » d’après une des polices de caractères du système (c’est-à-dire installées sur la machine).
-
pygame.font.Font : crée un nouvel objet « police de caractères » d’après un fichier de police de caractères.
Une documentation du module font de Pygame est disponible dans le chapitre Les principaux modules Pygame.
2. Utiliser des polices de caractères système avec Pygame
Nous commençons par utiliser le constructeur de SysFont, qui permet de définir l’utilisation d’une police de caractères disponible sur la machine utilisée. Ici, on se réfère à la police Arial en taille 35, que l’on désire afficher en gras et en italique. Le gras correspond au troisième paramètre (ici à 1) et l’italique...
Concevoir un logiciel de dessin avec Pygame
Dès lors que l’on sait afficher des formes géométriques, des images, du texte, mais également sauvegarder des images, on peut assez naturellement se dire qu’on a tous les éléments pour créer un petit logiciel de dessin.
Encore faut-il être capable d’attraper les événements de la souris si l’on veut s’en servir pour dessiner. C’est ce que nous allons voir immédiatement avant de construire un petit logiciel de dessin.
1. Gérer les événements de la souris ou du clavier en Pygame
Nous avons déjà vu précédemment la captation des événements du clavier ; la donne est sensiblement la même avec les événements de la souris.
La base du code est la suivante :
import pygame, sys
pygame.init()
# FENETRE DE 400 SUR 400
ECRAN = pygame.display.set_mode((400,400))
pygame.display.set_caption("Chapitre 5")
COULEUR_NOIRE = pygame.Color(0, 0, 0)
ECRAN.fill(COULEUR_NOIRE)
SUITE = True
# BOUCLE DE JEU
while SUITE:
for event in pygame.event.get():
if event.type == pygame.QUIT:
SUITE = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
SUITE = False
elif event.type == pygame.MOUSEBUTTONDOWN:
print(event)
elif event.type == pygame.MOUSEBUTTONUP:
print(event)
pygame.display.flip()
Nous voyons que l’on a une captation des événements du clavier, notamment l’appui sur la touche [Esc].
for event in pygame.event.get():
if event.type == pygame.QUIT: ...
Appliquer des transformations géométriques dans Pygame
1. Le module pygame.transform
Le propos du module est d’appliquer des transformations géométriques à des surfaces Pygame. Le module fournit entre autres la possibilité de procéder à :
-
des symétries axiales,
-
des homothéties,
-
des rotations.
Une documentation du module transform de Pygame est disponible dans le chapitre Les principaux modules Pygame.
2. Exemple d’utilisation des transformations Pygame
Nous choisissons d’afficher une petite image à laquelle nous allons appliquer diverses transformations géométriques. L’image choisie est celle du logo des Éditions ENI, éditeur du présent ouvrage.
Le code initial est le suivant :
import pygame, sys
import math
PI = math.pi
pygame.init()
# FENETRE DE 400 SUR 400 AVEC UN FOND NOIR
ECRAN = pygame.display.set_mode((400,400))
pygame.display.set_caption("Chapitre 5 - transformations")
COULEUR_NOIRE = pygame.Color(0, 0, 0)
ECRAN.fill(COULEUR_NOIRE)
#Image
logo = pygame.image.load("logo_ENI.png").convert()
ECRAN.blit(logo, (50, 50))
# BOUCLE DE JEU
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
pygame.display.flip()
Ce qui donne à l’écran :
Copie d’écran avant transformations géométriques
Nous allons voir trois transformations issues du module transform : deux transformations isométriques (la symétrie axiale ainsi que la rotation) et une homothétie.
Ci-après le code complet de l’exemple avant explications :
import pygame, sys
import math
PI = math.pi
...
Conclusion
Maintenant que nous avons étudié le dessin et donc les aspects graphiques, il s’agit à présent d’aborder un autre aspect : celui relatif au son et donc aux effets sonores, si important en développement de jeux vidéo.