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 pygameimport osimport traceback #module pour récupérer des infos sur les erreursfrom pygame.locals import * #on importe les constantes de pygamepygame.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'erreurtry: #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 boucleexcept: #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 basLes 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 pygamefrom pygame.locals import *import tracebackpygame.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,pygamefrom pygame.locals import *import tracebackblue=145,197,235clock=pygame.time.Clock() #voir à la fin, on veut choisir le nombre d'images par secondesdef image(chaine): """fonctions qui charge les sprites et rend le fond transparent etc..""" im=pygame.image.load(chaine) im=im.convert_alpha(im) return imtry: 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