Tutoriels pygame
Comme souvent, Openclassroom a mis en ligne un tutoriel très bien fait pour commencer à utiliser Pygame:
Voici un lien vers un autre tutoriel pour des informations complémentaires:
Il est également bon de connaître la page de référence de la documentation officielle de Pygame.
Bases de l'utilisation de Pygame
Ce cours vous présente quelques commandes de Pygame, permettant tout de même de réaliser de nombreux programmes.
Images utilisées pour illustrer les exemples (à copier et à enregistrer) :
perso1.png
course1.png
course2.png
course3.png
course4.png
Remarques préliminaires :
Création d'une fenêtre :
Voici le schéma d’un programme créant une fenêtre Pygame :
import pygame #importation de pygame
import os
import traceback #module pour récupérer des infos sur les erreurs
from pygame.locals import * #on importe les constantes de pygame
pygame.init() #on lance pygame
#toujours encadrer vos programmes pygame par try et finally ce qui permet de
# fermer correctement la fenêtre pygame en cas d'erreur
try:
#pour positionner la fenêtre sur l'écran à la position (400,600).
os.environ['SDL_VIDEO_WINDOW_POS']="400,600"
#création d'une fenêtre
fenetre=pygame.display.set_mode((640,480))#fenêtre de taille 640*480
continuer=1
#boucle perpétuelle qui permet de garder la fenêtre ouverte jusqu’à ce qu’on
# décide de la fermer
while continuer:
for event in pygame.event.get():
#pygame prend le premier évènement de la file
if event.type==QUIT:
#l'évènement QUIT correspond au clic sur la croix
continuer=0 #permet de quitter la boucle
except:
#ce bloc permet de récupérer des infos en cas d'erreur
traceback.print_exc()
finally:
pygame.quit()
exit()
Commandes additionnelles :
Mise en œuvre : Créer une fenêtre de taille 300*200 coloriée en bleu
Image
Pour afficher une image :
Commandes complémentaires :
On peut (entre autres) :
Mise en œuvre :
Afficher l’image « perso1.png » avec un fond transparent dans la fenêtre créée précédemment.
L’image devra être de taille 20*20 et être dans le coin en bas à droite.
Evènements
Exemple :
On reprend le programme du début et on insère après le bloc "if event.type==QUIT", d'autres blocs, par exemple :
if event.type==KEYDOWN: #appui sur une touche
if event.key==K_UP: #la touche est la flèche vers le haut
#déplacer le personnage d'une case vers le haut…(voir plus loin)
if event.key==K_DOWN:
#déplacer le personnage d'une case vers le bas
Les différents types d'évènements :
Si on maintient la touche enfoncée on peut répéter l'évènement avec la commande :
pygame.key.set_repeat(400,30) 400 est le délai (en millisecondes) avant que la répétition ne commence et à partir de là, un nouvel évènement est généré toutes les 30 ms. Si votre touche provoque un déplacement et que vous appuyez 550ms sur la touche, le déplacement va se faire une première fois au début, il y aura 400ms d'attente , puis il y aura un déplacement à 400ms, à 430 ms, à 460 ms….Le délai est là pour qu'il n'y ait pas de répétitions indésirables.
On peut récupérer les caractères tapés (par exemple si le joueur tape son nom et qu'on veut le récupérer) , après un if event.type==KEYDOWN:
carac=event.dict['unicode'] si on a tapé la touche K_a alors carac='a'
Pour attendre les évènements :
Les mouvements
Il est recommandé d'utiliser des formes rectangles (appelées "rect") qui contiennent les objets, ce qui permet de les déplacer facilement et de mieux gérer l'affichage, les effets de bord et les collisions.
Voici les attributs d'un rect appelé r :
Il est facile de gérer les collisions avec des rectangles. Si on a deux rectangles r1 et r2, pour savoir s'ils ont une intersection , on peut utiliser la commande : r1.colliderect(r2) qui retourne un booléen (True ou False).
Mise en œuvre :
Afficher « perso1.png » , récupérer son « rect » et l’afficher dans la console .
Recommencer, mais choisir vous-même le « rect » pour que le personnage soit au centre de l’écran.
Exemple de déplacement d'un personnage :
import pygame
from pygame.locals import *
import traceback
pygame.init()
try:
fenetre=pygame.display.set_mode((640,480))
fenetre.fill((255,255,255)) #on remplit la fenêtre de blanc
image1=pygame.image.load("perso1.png").convert_alpha()
#rend le fond transparent
image1_rect=image1.get_rect() #on crée un rectangle entourant l'image
fenetre.blit(image1,image1_rect) #on blitte l'image dans ce rectangle
pygame.key.set_repeat(400,30) #on active la répétition des touches
pygame.display.flip()
continuer=1
while continuer:
for event in pygame.event.get():
#attention, toujours prévoir un moyen de sortir de la boucle
if event.type==QUIT:
continuer=0
elif event.type==KEYDOWN:
if event.key==K_LEFT:
image1_rect=image1_rect.move(-5,0)
#on déplace le rectangle de l'image de 5 pixels vers la gauche
if image1_rect.left< 0:
#si le bord gauche de l'image sort du cadre,
#on remet l'image à droite
image1_rect.left=610
if event.key==K_RIGHT:
image1_rect=image1_rect.move(5,0)
if image1_rect.right> 640:
image1_rect.right=30
#si on ne re-remplit pas le fond,
#on verra l'objet aux deux positions
fenetre.fill((255,255,255))
fenetre.blit(image1,image1_rect)
pygame.display.flip()
except :
traceback.print_exc()
finally:
pygame.quit()
exit()
Les textes
Voici comment afficher une chaîne de caractères (str).
Mise en oeuvre :
Compléter le programme précédent pour que l’appui sur la touche « Echap » provoque l’affichage du texte suivant :
« Je me suis déplacé n fois » si le personnage a effectué n mouvements .
Les dessins
On peut dessiner des formes dans pygame :
Inutile de blitter, mais il faut rafraîchir l'écran.
On peut créer des surfaces (par exemple pour avoir deux parties dans une fenêtre) :
Le temps
· import pygame
· import os
· import traceback
· from pygame.locals import *
· pygame.init()
· try:
· fenetre=pygame.display.set_mode((640,480))
· fenetre.fill((255,255,255))
· image1=pygame.image.load("perso1.png").convert_alpha()
· image1_rect=image1.get_rect()
· fenetre.blit(image1,image1_rect)
· pygame.display.flip()
· #on crée un évènement qui n'est pas un évènement prédéfini par le système :
· #il faut lui donner un numéro pour que pygame le gère
· depla=USEREVENT+1 #on donne un numéro à l'évènement entre USEREVENT
· #et NUMEVENTS (qui sont des constantes de Pygame :sur mon ordinateur
· #cela se situe entre 25 et 31. On peut les faire afficher dans la console)
· #on peut aussi utiliser directement un numéro à la place de "depla")
· pygame.time.set_timer(depla,150)
· #l'évènement va se mettre dans la file des évènements toutes les 150 ms
· continuer=1
· while continuer:
· for event in pygame.event.get():
· if event.type==QUIT:
· continuer=0
· elif event.type==depla: #gestion de l'évènement répétitif
· #on fait ce que l'on veut, ici on déplace le personnage en diagonale
· image1_rect=image1_rect.move(3,3)
· fenetre.fill((255,255,255))
· fenetre.blit(image1,image1_rect)
· pygame.display.flip()
· except :
· traceback.print_exc()
· finally:
· pygame.quit()
· exit()
·
Animation
Pour animer un objet le principe est simple et est le même que dans les dessins animés : on affiche successivement des images de l'objet dans différentes positions après avoir « effacé » le précédent.
Voici un exemple :
import sys,pygame
from pygame.locals import *
import traceback
blue=145,197,235
clock=pygame.time.Clock()
#voir à la fin, on veut choisir le nombre d'images par secondes
def image(chaine):
"""fonctions qui charge les sprites et rend le fond transparent etc.."""
im=pygame.image.load(chaine)
im=im.convert_alpha(im)
return im
try:
screen=pygame.display.set_mode((400,151))
b1=image("course4.png")
b2=image("course2.png")
b3=image("course3.png")
b4=image("course1.png")
b=[b1,b2,b3,b4]
#on fait une liste des images du personnage dans différentes positions
continuer=1
i=0 #index de l’image qu’on va afficher
while continuer:
for event in pygame.event.get():
if event.type in (QUIT, KEYDOWN):#pour quitter
continuer=0
screen.fill(blue)
#on va afficher successivement les images de la liste en revenant au début
#quand on est à la fin (avec i%4)
screen.blit(b[i%4],(180,54)) #(180,54) est la position où on blitte
i=i+1 #pour afficher ensuite l’image suivante
clock.tick(10) #on limite le nombre d'images à 10 images par seconde.
#sinon on ne voit rien, c’est trop rapide
pygame.display.flip()
except :
traceback.print_exc()
finally:
pygame.quit()
Et pour en savoir encore plus :
http://sdz.tdct.org/sdz/interface-graphique-pygame-pour-python.html