Documentation pour s’initier à Pygame Objectifs : ­ Débuter avec Pygame Tous le

Documentation pour s’initier à Pygame Objectifs : ­ Débuter avec Pygame Tous les fichiers ci-dessous (sources, images, sons) sont téléchargeables ici : Fichiers exemples pygame Les fichiers images et sons doivent se trouver dans le même dossier que les fichiers sources qui les utilisent. 1 Qu’est-ce que Pygame ? Pygame est une bibliothèque Python (écrite principalement en C) qui permet de créer des jeux simples. Elle permet de faire facilement des animations (déplacements d’images à l’écran , ...), de gérer du son ou de la vidéo. Pygame n’est pas fourni par défaut lorsqu’on installe Python. Pour l’installer, on peut choisir une distribution comme Edupython qui installe, en même temps que Python, un certain nombre de modules. On peut également l’installer après avoir installé Python à condition de bien choisir le fichier correspondant au système d’exploitation et à la version de Python déjà installée (Téléchargement de pygame). Attention, pygame ne fonctionne qu’avec une version 32 bits de Python (si on a une version 64 bits de Python, il faut la désinstaller et installer une version 32 bits). Le principe consiste à créer une boucle while principale : à chaque passage, une nouvelle image, où chaque objet est légèrement déplacé, est générée dans un buffer (mémoire tampon qui évite de dessiner directement à l’écran pour éviter de voir les éléments se dessiner au fur et à mesure). L’écran est ensuite effacé, puis la nouvelle image (une fois entièrement mise à jour dans le buffer) est affichée à l’écran. La succession rapide de toutes ces images donne l’impression de mouvement dans la fenêtre graphique. Les explications ci-dessous sont sous forme d’exemples typiques commentés : il faudra ensuite les adapter à chaque cas particulier. Exemple typique d’utilisation de Pygame (les explications sont en commentaire) : """ Balle qui rebondit sur les bords de la fenêtre graphique. """ import pygame taille = largeur , hauteur = 600, 400 #Taille de la fenêtre vitesse = [3, 3] #On déplace de 3 pixels en abscisse ou 3 pixels en ordonnée à chaque fois. Plus le nombre de pixels est élevé , plus ça semble rapide. noir = 0, 0, 0 #Couleur pour effacer la fenêtre pygame.init () # Initialisation de tous les modules de Pygame fenetre = pygame.display.set_mode(taille) #Création de la fenêtre avec les bonnes dimensions. fenetre est une Surface balle = pygame.image.load("ball.png") #Chargement de l’image qui représente la balle. balle est une Surface ballerect = balle.get_rect () #Attention: on ne travaille pas sur la Surface balle directement mais sur le rectangle où elle se trouve: c’est celui -ci qu’on déplace pour obtenir la nouvelle position continuer = True #variable booléenne qui permet de sortir de la boucle si elle est False. On quitte pygame si elle est False while continuer: for event in pygame.event.get(): #On parcourt tous les événements générés (clavier , souris , ...) ISN Eiffel Page 1 sur 9 if event.type == pygame.QUIT: #Si c’est un événement qui correspond à la sortie de pygame (clic sur la croix ...) , continuer devient False continuer = False ballerect = ballerect.move(vitesse) #On déplace le rectangle: le nouveau rectangle obtenu correspond à la nouvelle position de l ’image.Attention , on travaille dans un buffer (tampon) et rien ne se passe à l’écran ici if ballerect.left < 0 or ballerect.right > largeur: #On inverse le déplacement si on heurte un bord de la fenêtre vitesse [0] = -vitesse [0] if ballerect.top < 0 or ballerect.bottom > hauteur: vitesse [1] = -vitesse [1] fenetre.fill(noir) #On efface la totalité de la fenêtre (toujours dans le buffer) en la remplissant de noir fenetre.blit(balle , ballerect) #Permet de dessiner (dans le buffer) la Surface balle à l’endroit où se trouve le rectangle ballerect pygame.display.flip ()#Met à jour l’affichage de la fenêtre: affiche le contenu du buffer à l’écran. pygame.time.Clock ().tick (100)#Permet de ralentir l’exécution sur un ordinateur très rapide: permet d’exécuter la boucle 100 fois par seconde maximum pygame.quit ()#Ne pas oublier de quitter proprement pygame Remarques : ◦On importe pygame (import pygame) et on initialise tous les modules de pygame (pygame.init()). ◦On génère une fenêtre graphique (appelée fenetre dans l’exemple : fenetre = pygame.display.set_mode(taille)). ◦On charge l’image du fichier ball.png qui doit se trouver dans le même dossier que le module. Les images sont représentées par des objets de type Surface. La fenêtre graphique (ici fenetre) est une Surface. ◦On crée une boucle principale (while continuer :) avec la gestion d’un événement qui permet de sortir (pygame.QUIT). ◦Pour déplacer une image (de type Surface), on utilise le rectangle (de type Rect) où elle se trouve (ballerect = balle.get_rect()), et pas l’image elle-même. On décale alors ce rectangle (ballerect = balle- rect.move(vitesse)), ce qui donne la nouvelle position. ◦On efface l’écran (fenetre.fill(noir)) ◦On réaffiche l’image dans le nouveau rectangle obtenu (fenetre.blit(balle,ballerect ) ; cette instruction dessine l’image à la position où se trouve le nouveau rectangle ballerect). Tout ceci se passe dans le buffer et pas à l’écran. ◦on met à jour l’affichage avec l’instruction pygame.display.flip() qui affiche à l’écran le contenu du buffer. ◦L’instruction pygame.time.Clock().tick(100) permet de ralentir l’exécution sur un ordinateur très rapide : elle permet d’exécuter la boucle 100 fois par seconde maximum. Elle calcule le temps écoulé depuis le dernier appel à pygame.time.Clock().tick et met le programme en attente si ce temps est inférieur à un centième de seconde. 2 La fonction blit Cette fonction (appelée aussi "méthode" en programmation orientée objets) permet de dessiner une image (de type Surface) sur une autre. La syntaxe surface1.blit(surface2, position) permet de dessiner surface2 sur surface1 à l’emplacement position. position peut être un couple de coordonnées correspondant au coin haut gauche de surface2 dans le système de coordonnées de surface1. position peut également être un rectangle (de type Rect) et le coin haut gauche de ce rectangle donne la position du coin haut gauche de surface2 dans le système de coordonnées de surface1. Dans la pratique, on pourra utiliser un rectangle de mêmes dimensions que la Surface surface2 pour positionner surface2 dans surface1 car ce rectangle permet de gérer le déplacement (méthode move de la classe Rect), de savoir si la souris survole l’image (méthode collidepoint de la classe Rect), de gérer les collisions entre images (méthode colliderect de la classe Rect). Un rectangle de mêmes dimensions que surface2 peut être obtenu avec la syntaxe : rectangle = surface2.get_rect() Le dessin de surface2 sur surface1 se passe dans un premier temps dans une mémoire tampon (buffer) et il faut rafraîchir l’affichage (avec la méthode pygame.display.flip()) pour que le buffer soit affiché à l’écran. Pour déplacer une image à l’écran, voir les explications dans le paragraphe précédent. ISN Eiffel Page 2 sur 9 3 Dessiner des formes : lignes, rectangles, cercles, texte... On rappelle que les axes de coordonnées sont différents de ceux utilisés en mathématiques : l’origine du repère est en haut à gauche de la fenêtre graphique. L’axe des ordonnées est orienté vers le bas : Pour dessiner des lignes, rectangles, cercles..., on utilise le module draw de pygame. Tout est d’abord dessiné dans le buffer et il faut ensuite mettre à jour l’affichage avec pygame.display.flip(). Pour les couleurs, on peut utiliser des tuples à trois valeurs de la forme (rouge, vert, bleu) où rouge, vert, bleu sont des entiers entre 0 et 255. ◦Pour tracer une ligne, la syntaxe est pygame.draw.line(Surface, color, start_pos, end_pos, width=1). Le premier argument est la Surface sur laquelle la ligne est dessinée. start_pos et end_pos sont des couples de coordonnées. width est l’épaisseur. ◦Pour tracer un rectangle, la syntaxe est pygame.draw.rect(Surface, color, Rect, width=0). Le premier argument est la Surface sur laquelle le rectangle est dessiné. L’argument de type Rect peut être un rectangle ou un tuple de 4 valeurs : les deux premières sont les coordonnées haut gauche du rectangle à dessiner et les deux dernières sont la largeur et la hauteur. Si width vaut 0, le rectangle est rempli. ◦Pour tracer un cercle, la syntaxe est pygame.draw.circle(Surface, color, pos, radius, width=0). Le premier argument est la Surface sur laquelle le cercle est dessiné. L’argument pos est un tuple de 2 valeurs représentant les coordonnées du centre. Si width vaut 0, le cercle est rempli. ◦Pour tracer du texte à l’écran, on utilise le module font de pygame (font signifie police de caractères en anglais). On crée un objet de type Font qui représente la police (nom de la police, taille des caractères, gras,...) ; police = pygame.font.SysFont(’Arial’, 20, bold=True) On crée un objet de type Surface (c’est une image qui représente le texte) à partir de cette police : texte = police.render("Cliquer ici", True, (0,128,0)). Le premier argument est le texte à afficher, le deuxième indique si on applique l’antialias (anti crénelage : True signifie que les lettres seront lissées pour éviter le crénelage). Le troisième argument est la couleur. On dessine la Surface texte obtenue sur une autre Surface avec la méthode blit (voir le paragraphe sur blit). Exemple typique de tracés de dessins et de texte (les explications sont en commentaire) : """ Dessins de lignes , rectangles , cercles uploads/s3/ presentation-py-game.pdf

  • 24
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager