Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Pygame
  3. Les modules secondaires 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 modules secondaires Pygame

Introduction

Ce chapitre traite des modules de Pygame moins utilisés, qui peuvent être perçus comme secondaires. Il est possible que vos développements de jeux vidéo vous amènent toutefois à les manipuler. Le présent chapitre fera alors office de documentation très détaillée.

Les modules ou objets détaillés ici sont les suivants :

1. cursors

2. joystick

3. touch

4. math

5. surfarray

6. camera

Comme dans le chapitre précédent, on utilise la notation suivante. Celle-ci signifie que l’appel de la fonction Exemple1 qui prend en paramètre a et b renvoie un int :

Exemple1( a, b) -> int 

Autre exemple, la fonction Exemple2 qui prend en paramètres i, j et k renvoie un objet de type Color :

Exemple2( i, j, k) -> Color 

Le module cursors

Le module cursors permet de gérer le curseur lui-même. On entend par curseur le repère graphique qui est affiché à l’écran et qui correspond à « l’emplacement » courant de la souris. On a vu dans le chapitre Les principaux modules Pygame comment le module mouse permet de contrôler la position du curseur, mais c’est le module cursors qui permet de choisir l’apparence du curseur elle-même, qui peut être une autre représentation que celle par défaut.

Les apparences de curseur sont stockées sous un format graphique bitmap que le module permet de charger. Une fois l’apparence d’un curseur définie, elle est utilisable depuis le module mouse. Pour imposer cette nouvelle apparence de curseur, on utilise la fonction set_cursor du module mouse, comme ceci :

pygame.mouse.set_cursor(*pygame.cursors.arrow) 

On notera également que le module définit plusieurs curseurs tous utilisables d’emblée.

Signalons enfin que Pygame permet uniquement une apparence de curseur en noir et blanc (monochrome).

1. Les curseurs prédéfinis du module

Les curseurs suivants sont disponibles et utilisables immédiatement. C’est-à-dire qu’on peut les utiliser d’emblée avec set_cursor du module mouse.

pygame.cursors.arrow 
 
pygame.cursors.diamond 
 
pygame.cursors.broken_x 
 
pygame.cursors.tri_left 
 
pygame.cursors.tri_right 

Les chaînes de caractères suivantes correspondant à des apparences de curseur sont également disponibles, mais nécessitent préalablement l’action de la fonction compile du module cursors. Cette fonction est à même de les convertir en apparence de curseur, c’est-à-dire en un format bitmap.

pygame.cursors.thickarrow_strings ...

Le module joystick

Le module joystick permet de gérer les périphériques de jeu de type joystick, y compris quand ils incluent des boules de commande et des contrôles divers et variés. L’ensemble des exemples du livre impliquent l’usage du clavier et celui de la souris. Il s’agit ici de voir comment on peut gérer un joystick avec Pygame.

Ce module inclut un objet Joystick dont une instance correspond à un joystick donné. On commence par étudier les fonctions du module avant d’étudier cet objet Joystick.

1. La fonction init

init() -> None 

La fonction init permet d’initialiser le module. Comme souvent, elle est automatiquement appelée par la fonction d’initialisation de Pygame pygame.init().

2. La fonction quit

quit() -> None 

Le fonction quit est la fonction réciproque de la fonction init. Elle permet de signifier que l’on cesse d’utiliser le module joystick.

3. La fonction get_init

get_init() -> bool 

La fonction get_init permet de savoir si la fonction init du module a effectivement été appelée ou non. Elle renvoie un booléen et donc la valeur True si c’est effectivement le cas.

4. La fonction get_count

get_count() -> count 

La fonction get_count permet d’obtenir le nombre de joysticks connectés au poste informatique courant, en tout cas les périphériques reconnus comme tels. Pour chacun des joysticks, on peut décider de les gérer et de les utiliser dans le jeu vidéo Pygame ; pour chaque joystick que l’on utilise dans le jeu, on instancie un objet Joystick dédié.

5. La classe Joystick

a. La fonction Joystick

Joystick(id) -> Joystick 

C’est le constructeur de cette classe. On le détaille ici car il a la particularité de prendre en paramètre un entier identifiant le joystick associé....

Le module touch

Ce module, qui nécessite obligatoirement SDL2, permet de gérer les périphériques tactiles.

1. La fonction get_num_devices

get_num_devices() -> int 

Cette fonction permet d’obtenir le nombre de périphériques tactiles effectivement disponibles.

2. La fonction get_device

get_device(index) -> touchid 

Cette fonction permet d’obtenir l’identifiant d’un périphérique tactile en passant en paramètre l’index de ce périphérique dans la collection. Il faut donc que l’index soit égal au moins à 0 et inférieur au nombre de périphériques tactiles.

3. La fonction get_num_fingers

get_num_fingers(touchid) -> int 

La fonction get_num_fingers permet d’obtenir le nombre de doigts actifs sur un périphérique tactile donné.

4. La fonction get_finger

get_finger(touchid, index) -> dict 

La fonction get_finger prend en paramètre le touchid d’un des périphériques tactiles et l’index d’un des doigts actifs sur ce périphérique. On obtient en retour un dictionnaire incluant les valeurs suivantes :

  • l’identifiant id du doigt,

  • la coordonnée x de la position du doigt,

  • la coordonnée y de la position du doigt,

  • la pression d’appui du doigt.

Le module math

Ce module permet de faire du calcul vectoriel au sein même de Pygame. Il autorise en effet la définition de vecteurs en dimension 2 ou 3. On peut alors appliquer un certain nombre d’opérations sur ces vecteurs.

Il existe deux classes dans ce module : Vector2 (vecteur en dimension 2) et Vector3 (vecteur en dimension 3).

1. La classe Vector2 - Création de vecteur

Vector2() -> Vector2 
 
Vector2(int) -> Vector2 
  
Vector2(float) -> Vector2 
 
Vector2(Vector2) -> Vector2 
 
Vector2(x, y) -> Vector2 
 
Vector2((x, y)) -> Vector2 

Les prototypes précédents permettent de créer un vecteur en dimension 2.

Ci-après un petit exemple :

vec = pygame.math.Vector2(150,180) 
print(vec.x) 
print(vec.y) 

2. La classe Vector3 - Création de vecteur

Vector3() -> Vector3 
 
Vector3(int) -> Vector3 
 
Vector3(float) -> Vector3 
 
Vector3(Vector3) -> Vector3 
 
Vector3(x, y, z) -> Vector3 
 
Vector3((x, y, z)) -> Vector3 

Les prototypes précédents permettent de créer un vecteur en dimension 3.

Exemple

vec = pygame.math.Vector3(150,180, 210) 
print(vec.x) 
print(vec.y) 
print(vec.z) 

3. Les principales fonctions de Vector2 et Vector3

Toutes les fonctions de Vector2 ont leurs équivalents dans Vector3. Nous allons donc détailler les principales fonctions de Vector2 sachant que les fonctions correspondantes existent dans la classe gérant la dimension 3.

a. La fonction dot

dot(Vector2) -> float 

La fonction dot permet de calculer un produit scalaire entre deux vecteurs.

Exemple

vecA = pygame.math.Vector3(1, 2) 
vecB = pygame.math.Vector3(3, 4) 
dotAB = vecA.dot(vecB) 
print(dotAB) 

b. La fonction length

length() -> float 

Cette fonction length permet de calculer la norme euclidienne du vecteur...

Le module surfarray

Il peut être intéressant parfois de sauvegarder les surfaces Pygame ou, du moins, de les stocker sous forme de tableaux. C’est le rôle du module surfarray, qui permet la conversion d’une surface en un tableau de pixels.

1. La fonction array2d

array2d(Surface) -> array 

Cette fonction array2d permet de convertir une surface Pygame en un tableau de pixels.

Exemple

surface = pygame.image.load("image.png").convert() 
tableau = pygame.surfarray.array2d(surface) 

2. La fonction pixels_red

pixels_red (Surface) -> array 

Cette fonction permet de créer un tableau qui référence toutes les valeurs rouges (RGB) de pixels d’une surface.

3. La fonction pixels_green

pixels_green (Surface) -> array 

Cette fonction permet de créer un tableau qui référence toutes les valeurs vertes (RGB) de pixels d’une surface.

4. La fonction pixels_blue

pixels_blue (Surface) -> array 

Cette fonction permet de créer un tableau qui référence toutes les valeurs bleues (RGB) de pixels d’une surface.

5. La fonction make_surface

make_surface(array) -> Surface 

La fonction make_surface permet de créer une surface Pygame à partir d’un tableau de pixels tel que créé par exemple avec la fonction array2d.

6. La fonction blit_array

blit_array(Surface, array) -> None 

La fonction blit_array prend en paramètre une surface Pygame et un tableau de pixels qui permet d’afficher directement la surface à partir des données dudit tableau.

Le module camera

Ce module expérimental permet de faire de la capture vidéo. On entend par capture vidéo la capacité de sauver chaque image du déroulement d’une partie, pour générer une vidéo, voire un flux vidéo, pour faire du streaming par exemple. Ainsi, la partie en cours peut être visionnée en temps réel.

Le module camera est expérimental dans la mesure où il n’y aucune garantie que ce module soit supporté dans les versions à venir de Pygame. Par ailleurs, il est pour le moment restreint à des environnements utilisant des API bien précises de capture vidéo (Video4Linux notamment).

Avant de détailler le contenu du module, voici un exemple très simple d’une capture vidéo effectuée sur une fenêtre de jeu (dans laquelle il ne se passe rien de spécial). La finalité est de générer une vidéo nommée output.avi.

import pygame, sys, os 
import pygame.camera 
 
 
pygame.init() 
pygame.camera.init() 
 
 
ECRAN = pygame.display.set_mode((400, 400)) 
 
 
cam = pygame.camera.Camera("/dev/video0", (400, 400)) 
cam.start() 
 
 
NUM = 0 
CAPTURE = False 
 
 
while not CAPTURE: 
 NUM = NUM + 1 
 image = cam.get_image() 
 screen.blit(image, (0,0)) 
 pygame.display.update() 
 
 NOM_FICHIER = "PHOTOS/%04d.png" % NUM 
 pygame.image.save(image, NOM_FICHIER) 
 
 for event in pygame.event.get(): 
   if event.type == pygame.QUIT: 
     CAPTURE = True 
      
os.system("avconv -r 8 -f image2 -i PHOTOS/%04d.png -y -qscale 0 -s 640x480 - 
aspect 4:3 output.avi") 

1. La fonction list_cameras

list_cameras()...