======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. {{ :nsi:tds:pygame:candycrush:fruits.zip |}}