GERBELOTBARILLON.COM

Parce qu'il faut toujours un commencement...

PyGame Zero

0. Introduction


PyGame Zero est une bibliothèque de programmation de jeux vidéos basée sur PyGame avec pour objectif de simplifier encore plus l'accès à cet univers fascinant qu'est la programmation, notamment de jeux. PyGame Zero est aujourd'hui un bine meilleur outil d'apprentissage de la programmation orienté Kids que ne l'est Scratch. De plus l'usage de Python comme langage de développement permet d'ouvrir l'accès à un très vaste univers de développement passé, présent et à venir.

Documentation officielle : https://pygame-zero.readthedocs.io/en/stable

1. Installation


Python pour Windows
Pour les autres systèmes, si c'est Linux ou équivament, Python 3 est normalement déjà installé. Sinon rendez-vous sur https://www.python.org pour télécharger la version qui correspond à votre environnement.

PyGame Zero
Pour installer simplement PyGame Zero, depuis l'invite de commande, tapez pip install pgzero.

2. Principe


PyGame Zero est un wrapper autour de l'environnement PyGame. Son objectif est de simplifier la mise en place d'objets graphiques et leur interaction, ainsi que la prise en charge transparente de la logique applicative tournant autour du jeu : boucle d'événements, interaction entre les objets, gestion audio...

Un programme simple réalisé avec PyGame Zero qui permet d'afficher une fenêtre de 800 x 600 pixels avec un fond noir est équivalent à ceci

WIDTH = 800
HEIGHT = 600

def draw():
   screen.fill((0,0,0))
Pour lancer le programme, il suffit, depuis une commande DOS, de faire pgzrun <nom du programme>. Vous pouvez remarquer que c'est d'une grande simplicité tout de même. Petite digression au passage. PyGame Zero essaie de reprendre les mêmes principes que le méta langage AMOS avait mis en place il y a déjà de fort longues années sur un des ordinateurs phares des années 1990 : le Commodore Amiga. Nous pouvons également le comparer au langage Processing qui permet également de réaliser des choses incroyables avec seulement quelques lignes de code.

Si l'on compare avec la même chose réalisée avec Pygame, nous obtiendrions quelque chose d'équivalent à ceci

import pygame

pygame.init()

size = 800, 600
screen = pygame.display.set_mode(size)

clock = pygame.time.Clock()
while True:
   for event in pygame.event.get():
      if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_q:
            sys.exit()

   screen.fill(pygame.Color("black"))
   pygame.display.flip()
   clock.tick(60)

3. Eléments statiques


Le fonctionnement de PyGame Zero repose sur des constantes et des fonctions prédéfinies qui réalisent automatiquement des actions pour le programmeur.

Constantes et variables

PyGame Zero défini les quelques constantes suivantes (attention à bien les écrire dans votre code) :

Les variables suivantes jouent également un rôle particulier dans PyGame Zero :

Fonctions

draw()

Tout ce qui doit être dessiné à l'écran doit s'effectuer dans cette fonction.
Ne réalisez pas de calculs ou de mises à jour d'éléments car cela doit s'effectuer dans la fonction update().
update()
Tout ce qui doit être mis à jour doit s'effectuer dans cette fonction. Cela inclut les positions des objets, l'ajout ou la suppression d'éléments graphiques, la gestion des sprites...
Ne réalisez pas d'affichage à partir de cette fonction. c'est le rôle de la fonction draw().
on_mouse_down(pos, button) on_mouse_up(pos, button)
Fonction appelée lors d'un appui sur un bouton de la souris. Donne la position (x, y) à laquelle la pression s'est effectuée ainsi que le numéro du bouton actionné.
on_mouse_move(pos, rel, buttons)
Fonction appelée lorsque la souris est déplacée. Donne la position (x, y) de la souris, les coordonnées relatives (dx, dy) du déplacement du curseur ainsi que les boutons actionnés.
Les noms des boutons sont : LEFT, RIGHT, MIDDLE, WHEEL_UP, WHEEL_DOWN.
on_key_down(key, mod) on_key_up(key, mod)
Fonction appelée lors de l'appui sur une touche du clavier. Donne la valeur de la touche sous la forme d'un entier PyGame (du type K_ESCAPE par exemple) ainsi que les modificateurs de touche survenus.
Touches clavier
  • Chiffres : keys.K_1, keys.K_2, ...
  • Lettres : keys.K_A, keys.K_B, ...
  • Mouvements : keys.UP, keys.DOWN, keys.LEFT, keys.RIGHT, keys.HOME, keys.END, keys.PAGEUP, keys.PAGEDOWN
  • Fonctions : keys.F1, keys.F2, ...
  • Autres touches : keys.RIGHTBRACKET, keys.ESCAPE, keys.AT, ...

Modificateurs de touches
  • SHIFT : keymods.SHIFT, keymods.LSHIFT, keymods.RSHIFT
  • CTRL : keymods.CTRL, keymods.LCTRL, keymods.RCTRL
  • ALT : keymods.ALT, keymods.LALT, keymods.RALT

Dossiers

PyGame Zero définit des dossiers par défaut dans lesquels il va chercher les différentes ressources requises pour vos jeux. Ce sont les dossiers images, music/ et sounds qui devront contenir les objets graphiques et sonores que PyGame devra reproduire.


.
|-- images/
|     |-- image1.png
|     |-- image2.png
|
|-- music/
|    |-- music1.mp3
|
|-- sounds/
|     |-- audio1.mp3
|     |-- sound1.wav
|
|__ game.py
               

4. Images


Les images peuvent être de trois formats différents : .png, .gif et .jpg. Le format PNG est fortement recommandé pour sa capacité de transparence, de gratuité et de bonne qualité. Le format GIF est propriétaire et le JPG plutôt pour la photographie. Toutes les images du jeu doivent se trouver dans le dossier images/. Lors de l'appel des fonctions graphiques avec le nom du fichier, celui-ci ne doit pas contenir son extension. Dans l'exemple qui suit, la fonction blit() va chercher le fichier 'vélo' dans le dossier images/, et va l'ouvrir si son extension est une des trois supportées.

def draw():
   screen.clear()
   screen.blit('velo', (10, 10))

L'autre moyen de stocker les images pour les objets graphiques est d'utiliser un Actor. Je vous conseille de lire les descriptions de la classe Actor pour la gestion des objets animés (les sprites comme ont dit). La lecture du fichier graphique est la même que pour la fonction blit() avec la recherche dans le dossier images/ local.

velo = Actor('velo')
def draw():
   screen.clear()
   velo.draw()

Les surfaces constituent le support des pixels des images. Elles peuvent être gérées en mémoire ou bien directement par le GPU des cartes graphiques pour plus de performances. La classe Surface dispose de méthodes pour obtenir des informations à leur sujet.
class Surface
get_width()
Retourne la largeur de la surface en pixels.
get_height()
Retourne la hauteur de la surface en pixels.
get_size()
Retourne la dimension de la surface en pixels sous la forme d'un tuple (width, height).
get_rect()
Retourne le rectangle rempli avec les limites de l'image, comme si elle était située sur l'origine du rectangle. Cela revient à obtenir Rect((0, 0), image.get_size()).

5. Sounds


Pygame Zero est capable de gérer des sons au format .wav et .ogg uniquement. Il faut réserver les fichiers WAV pour les effetes sonores tandis que les fichiers OGG sont plutôt dédiés à la musique. Comme pour les images les sons doivent se trouver dans le dossier sounds/ du dossier du jeu.


class Sounds
play()
Joue le son défini
play(loops)
Joue le son défini un nombre de fois équivalent à la valeur loops. Si loops = -1 alors le son se joue sur une boucle infinie sans arrêt.
stop()
Arrête de jouer le son en cours.
get_length()
Récupère la durée du son en secondes.