module coin

Une pièce (coin) pourrait avoir une valeur variable ; il pourrait y avoir divers récompenses (comme les fruits qui passaient dans Pac-Man et qu'il fallait attraper).

On suppose donc que la récompense est identifiée par son type. Pour l'instant, il n'y a qu'un seul type de récompense, on pourra améliorer plus tard.

Ce type de pièce est représenté par l'image ci-contre que vous pouvez télécharger. dollar.png

Il faut le placer dans le même répertoire que les autres.

# coin.py

import pygame

class Coin(pygame.sprite.Sprite):
    TYPES = {
        "dollar":{
            "filename": 'dollar.png',
            "valeur":10,
            "size":(20, 20)
        }
    }

    def __init__(self, x, y, coin_type):
        """
        x, y: position du centre de la pièce
        coin_type: type de pièce
        Cette fonction crée une récompense
        """
        super().__init__()
        assert coin_type in Coin.TYPES
        attributes = Coin.TYPES[coin_type]
        image = pygame.image.load(attributes["filename"])
        image = image.convert_alpha()
        self.image = pygame.transform.scale(image, attributes["size"])
        self.valeur = Coin.TYPES[coin_type]["valeur"]
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.centery = y

On a défini une constante TYPES que l'on peut atteindre avec Coin.TYPES.

Il s'agit d'une constante qui est attachée à la classe elle-même. Cette constante permet de lister les différents types de récompenses que l'on pourrait désirer. Ici on n'a seulement "dollar". On voit qu'on n'aurait aucune peine à en définir d'autres.

La production de l'image est un peu compliquée : il faut récupérer le fichier image avec pygame.image.load. convert_alpha permet de tenir compte de la transparence de certains éléments de l'image. pygame.transform.scale permet de la redimensionner à la taille désirée.

Le choix fait ici est critiquable : à chaque création de Coin, il faut accéder au système de fichier pour lire le fichier image. On verra plus tard qu'il serait plus avantageux de ne charger qu'une seule fois les différentes images nécessaires.

Comme pour les rectangles, il est bienvenu de prévoir une fonction pour créer plusieurs coins.

# coin.py

import pygame
from abc import abstractmethod

class Coin(pygame.sprite.Sprite):
    ...

    @abstractmethod
    def make_coins(liste):
        """
        liste: tableau de (x, y, coin_type) donnant les caractéristiques des coins à créer
        renvoie un groupe contenant les coins
        """
        groupe = pygame.sprite.Group()
        for x, y, coin_type in liste:
            c = Coin(x, y, coin_type)
            groupe.add(c)
        return groupe