Outils pour utilisateurs

Outils du site


nsi:tds:pygame:candycrush:loader

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Module loader

Quelques explications : Quand on charge un fichier image, Python doit lancer une demande vers le système d'exploitation qui va devoir aller chercher le fichier sur le disque dur… Un chargement est rapide mais si on doit charger des milliers de fois, on risque d'avoir des ralentissements.

On va s'efforcer de ne pas accéder inutilement au système de fichier. Quand un fichier image a été chargé, on garde le contenu dans une mémoire pour ne pas avoir à refaire le chargement la prochaine fois que l'on aura besoin de cette image.

C'est le rôle du Loader.

# loader.py
# créer un sous-dossier images
# placer une image defaut.png dans ce sous-dossier

import pygame

IMAGES = {
    "banane":"banane.png",
    "cerise":"cerise.png",
    "orange":"orange.png",
    "poire":"poire.png",
    "pomme":"pomme.png"
}

FOLDER = "./images/"

loaded = {}


def load(name, width, height):
    """
    accède à l'image d'identifiant name.
    si l'image n'est pas déjà dans loaded, l'ajoute.
    renvoie l'image.
    """
    key = (name, width, height)
    if key not in loaded:
        filename = IMAGES.get(name, "defaut.png")
        image = pygame.image.load(FOLDER + filename)
        image = image.convert_alpha()
        image = pygame.transform.scale(image, (width, height))
        loaded[key] = image
    return loaded[key]

Quelques mots d'explications :

  • On créera un sous-dossier images pour contenir les fichier image.
  • Pour les cas d'erreur, on place une image par défaut dans ce dossier. On l'appellera defaut.png
  • IMAGES permet d'associer une clé, par exemple "orange" à un nom de fichier "orange.png". Dans le programme on aura donc plus besoin de se soucier des noms de fichier, on pourra se contenter d'indiquer la clé. Naturellement, il faut créer ces fichiers !
  • loaded gardera en mémoire toutes les images précédemment chargées.
  • Lorsque l'on charge une image, on précise le nom de la clé. Si l'image correspondante n'est pas déjà chargée, on récupère le nom de fichier, on charge l'image et on la stocke dans loaded.

Utilisation dans un autre module : Si j'ai besoin de charger l'image name dans un autre module du projet, il faudra indiquer en début de module :

import loader

Puis au moment de charger :

image = loader.load(name, 40, 40)

Je vous ai préparé quelques images. Vous êtes libre d'en prendre d'autres. fruits.zip

nsi/tds/pygame/candycrush/loader.txt · Dernière modification : de goupillwiki