Développement d’un jeu « Invasion extraterrestre » avec Pygame : ajout du vaisseau et refactorisation

Ajout de l'image du vaisseau

Nous allons intégrer le vaisseau dans le jeu. Pour afficher le vaisseau du joueur à l’écran, nous chargeons une image et utilisons la méthode blit() de Pygame.

Pour choisir des ressources visuelles, il est crucial de respecter les licences. La solution la plus simple et économique consiste à utiliser des images libres de droits provenant de plateformes comme Pixabay.

Pygame prend en charge nativement les fichiers bitmap (.bmp). D’autres formats (.jpg, .png) nécessitent l’installasion de bibliothèques supplémentaires. Privilégiez des images avec un fond transparent ou une couleur unie pour faciliter l’intégration dans le jeu.

Dans le cadre de ce projet, nous utilisons le fichier ship.bmp. Créez un dossier images dans le répertoire du projet (alien_invasion) et placez-y ce fichier.

Création de la classe Ship

Créons un module ship.py contenant la classe Ship qui gère le comportement du vaisseau.

import pygame

class Ship:
    """Classe pour gérer le vaisseau."""

    def __init__(self, ai_game):
        """Initialise le vaisseau et sa position de départ."""
        self.screen = ai_game.screen
        self.screen_rect = ai_game.screen.get_rect()

        # Charge l'image du vaisseau et récupère son rectangle
        self.image = pygame.image.load('images/ship.bmp')
        self.rect = self.image.get_rect()

        # Positionne le vaisseau en bas au centre
        self.rect.midbottom = self.screen_rect.midbottom

    def blitme(self):
        """Dessine le vaisseau à sa position actuelle."""
        self.screen.blit(self.image, self.rect)

Pygame traite tous les éléments de jeu comme des rectangles (rect), ce qui simplifie la détection de collisions. La classe Ship reçoit une référence à l’instance principale du jeu (ai_game) pour accéder à l’écran. La méthode get_rect() permet de récupérer les dimensions de l’écran et de l’image.

Le point d’origine (0,0) se trouve en haut à gauche de l’écran. Les coordonnées augmentent vers la droite et vers le bas. Nous plaçons le vaisseau en bas au centre en définissant midbottom sur celui de l’écran.

Affichage du vaisseau

Mettons à jour alien_invasion.py pour instancier et afficher le vaisseau :

--snip--
from settings import Settings
from ship import Ship

class AlienInvasion:
    """Classe principale gérant les ressources et le comportement du jeu."""

    def __init__(self):
        --snip--
        pygame.display.set_caption("Alien Invasion")
        self.ship = Ship(self)

    def run_game(self):
        --snip--
        # Redessine l'écran à chaque itération
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        pygame.display.flip()
--snip--

Après avoir importé la classe Ship, nous créons une instance en passant self en argument. L’appel à blitme() dessine le vaisseau après le remplissage de l’arrière-plan.

Refactorisation : méthodes _check_events() et _update_screen()

Avant d’ajouter de nouvelles fonctionnalités, nous restructurons le code pour le rendre plus modulaire. Les méthodes auxiliaires (préfixées par un tiret bas) isolent des tâches spécifiques.

Méthode _check_events()

Extrayons la gestion des événements :

def run_game(self):
    while True:
        self._check_events()
        self._update_screen()

def _check_events(self):
    """Répond aux pressions de touches et aux événements souris."""
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

La nouvelle méthode centralise la détection des événements, ce qui allège la boucle principale.

Méthode _update_screen()

De même, isolons le rafraîchissement de l’écran :

def _update_screen(self):
    """Met à jour l’affichage et bascule vers le nouvel écran."""
    self.screen.fill(self.settings.bg_color)
    self.ship.blitme()
    pygame.display.flip()

La boucle principale devient plus concise : chaque itération vérifie les événements et met à jour l’écran. Cette organisation facilite l’extension future du jeu.

Étiquettes: Pygame Jeu vidéo Python développement de jeu refactorisation

Publié le 9 juillet à 00h39