Une fois encore, nous complétons le script précédent.
Dans sa version la moins élaborée, on remplace le code suivant dans la classe Player :
self.image = pygame.Surface((TILESIZE,TILESIZE))
self.image.fill(YELLOW)
par
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
ETAPE 6
- ici, au lieu de déplacer une forme, on va déplacer une image qui sera notre
personnage.
- Notre surface n'est plus un carré mais une image chargée à partir d'un fichier image
- On chargera deux images : une pour le perso qui va à droite, une pour le perso qui
va à gauche
@author: YF
Dernière mise à jour : sept 2022
"""
import pygame
# Taille et titre de la fenêtre / Frames par seconde
SCREENSIZE = (800, 600)
TITLE = "Tuto Pygame"
FPS = 60
# Taille des sprites en pixels
TILESIZE = 32
# Vitesse de déplacement du personnage
PLAYER_VEL = 10
# Définition des couleurs et de la couleur de fond
DARKGREY = (40,40,40)
LIGHTGREY = (110,110,110)
YELLOW = (255,255,0)
BGCOLOR = LIGHTGREY
class Player(pygame.sprite.Sprite):
"""
Classe Player qui permet de dessiner un personnage à l'écran
Pour l'instant, ce personnage a une forme de carré
"""
# constructeur de la classe
def __init__(self, x, y):
# initialisation de la classe Sprite du module pygame.sprite
super().__init__()
# on charge une image qui définit le personnage vers la droite
self.image_right = pygame.image.load("assets/perso_right.png")
# on charge une autre image qui définit le personnage vers la gauche
self.image_left = pygame.image.load("assets/perso_left.png")
# au début, l'image est celle du personnage de droite (par défaut)
self.image = self.image_right
# récupère les dimensions du rectangle entourant l'image (x,y,largeur,hauteur)
self.rect = self.image.get_rect()
# on place l'image en x,y passés en paramètres au constructeur
self.rect.x = x
self.rect.y = y
def move(self, direction):
# déplacement du personnage en fonction de la direction passée en paramètre
# si la forme atteint les bords de l'écran, le déplacement est stoppé
# on définit l'image en fonction de la direction
if direction == "R" and self.rect.right < SCREENSIZE[0]:
self.image = self.image_right
self.rect.x += PLAYER_VEL
elif direction == "L" and self.rect.left > 0:
self.image = self.image_left
self.rect.x -= PLAYER_VEL
elif direction == "D" and self.rect.bottom < SCREENSIZE[1]:
self.image = self.image_right
self.rect.y += PLAYER_VEL
elif direction == "U" and self.rect.top > 0:
self.image = self.image_right
self.rect.y -= PLAYER_VEL
class Game(object):
# Constructeur de la classe
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode(SCREENSIZE)
pygame.display.set_caption(TITLE)
self.clock = pygame.time.Clock()
self.running = True
# méthode permettant de fermer la fenêtre
def closeWindow(self):
if self.playing:
self.playing = False
self.running = False
# méthode de gestion de la saisie au clavier (pour l'instant seulement fin du jeu)
def events(self):
# récupération des touches qui sont "enfoncées"
keys = pygame.key.get_pressed()
# fermeture de la fenêtre à la l'aide de la croix
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.closeWindow()
# fermeture de la fenêtre à l'aide de la touche Echap
if keys[pygame.K_ESCAPE]:
self.closeWindow()
# déplacement du joueur avec les flèches
elif keys[pygame.K_RIGHT]:
self.player.move("R")
elif keys[pygame.K_LEFT]:
self.player.move("L")
elif keys[pygame.K_DOWN]:
self.player.move("D")
elif keys[pygame.K_UP]:
self.player.move("U")
# méthode qui met à jour tous les sprites du groupe
def update(self):
# mise à jour de tous les sprites du groupe all_sprites
self.all_sprites.update()
# méthode qui contient tout ce qui doit apparaître dans la fenêtre et la rafraîchit
def draw(self):
# couleur de fond d'écran
self.screen.fill(BGCOLOR)
# on dessine tous les sprites du groupe all_sprites dans la fenêtre
self.all_sprites.draw(self.screen)
pygame.display.update()
# méthode qui regroupe tous les évènements de la boucle de jeu ou d'animation
def run(self):
self.playing = True
while self.playing:
self.events()
self.update()
self.draw()
self.clock.tick(FPS)
def new(self):
# on crée un groupe de sprites
self.all_sprites = pygame.sprite.Group()
# instanciation pour créer un personnage à partir de la classe Player
# positionné au milieu de l'écran
# SCREENSIZE[0] = largeur / SCREENSIZE[1] = hauteur
self.player = Player(SCREENSIZE[0] / 2, SCREENSIZE[1] / 2)
# on ajoute notre objet player au groupe de sprites all_sprites
self.all_sprites.add(self.player)
# programme principal
game = Game()
game.new()
while game.running:
game.run()
pygame.quit()
Qu'apporte cette petite modification de notre programme ? :
On ne crée plus une surface carrée qu'on remplit de la couleur jaune.
On utilise, à la place, la fonction load du module image de pygame. En paramètre, on donne à cette fonction l'emplacement du fichier image (entre guillemets).
Amélioration : changer l'image en fonction de la direction prise par le personnage :
Avec la modification précédente de notre script, on déplace notre personnage comme le carré. Problème : l'image reste la même.
Pour améliorer un tout petit peu l'apparence de notre programme, il suffit de mettre une image différente pour le déplacement vers la droite ou vers la gauche et de définir l'image du départ:
self.image_right = pygame.image.load("assets/perso_right.png")
self.image_left = pygame.image.load("assets/perso_left.png")
self.image = self.image_right # l'image de départ est le personnage de direction droite
Et, dans la méthode move de la classe Player, on modifie l'image en fonction de la direction. Le programme complet est le suivant :
EN COURS DE REDACTION