Analysons notre programme précédent.
Après un petit commentaire qui présente le programme, nous définissons quelques constantes:
- une (DELAY) pour pouvoir choisir le temps entre 2 cycles de la boucle principale (elle permet de faire attendre le programme quand il a fini de traiter la procédure principale “loop” avant de la relancer)
- les 2 suivantes (WIDTH_TILE et HEIGHT_TILE) définissent la taille d’un des éléments de la carte.
- les 2 suivantes (X_TILES et Y_TILES) définissent le nombre de TILES que nous allons utiliser dans la largeur et dans la hauteur.
Nous incluons ensuite 2 fichiers:
-
image.h c’est dans ce fichier que nous mettons tous les codes correspondant aux images que nous allons utiliser (dans cet exemple, il n’y aura que la conversion de notre tileset)
//Our 4 bits Tileset (16 coulours indexed)
const uint8_t tileset[] PROGMEM = {
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd1, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x14, 0x1d, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x6d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6d,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd1, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0xdd, 0xdd, 0xd6, 0x66, 0x66, 0x66, 0x6d, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xc5, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xc5, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x6d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xcc, 0xcc, 0xcc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xcc, 0xcc, 0xcc, 0xdd, 0xdd, 0xdd, 0xcc, 0xcc, 0x55, 0x55, 0x55, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x6d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0x55, 0x55, 0x55, 0xcc, 0xcc, 0xcc, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x6d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x6d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd1, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x6d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x13, 0x1d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0xcc, 0xdd, 0xdd, 0xdd, 0xcc, 0xcc, 0xc5, 0x55, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x55, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x6d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd1, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0xcc, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x6d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xdd, 0x6d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd6, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdc, 0x55, 0x5c, 0xdd, 0xdd, 0xdd, 0xd6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x6d, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
};
- Vous connaissez le second fichier que nous appelons: “ESPboyInit.h” qui permet d’initialiser l’ESPboy
Nous ajoutons ensuite la constante Tileset_size que nous initialisons avec la valeur de la largeur en pixels de notre Tileset (160 dans notre exemple)
Nous créons ensuite une instance de notre ESPboy en l’initialisant:
ESPboyInit myESPboy; // Invoke custom library
Puis nous créons avec l’instruction ci-dessous le sprite spr qui s’affichera sur l’objet TFT de notre ESPBoy qui a été initialisé lors de la commande précédente.
TFT_eSprite spr = TFT_eSprite(&myESPboy.tft);
Nous créons ensuite un tableau avec les valeurs standards pour les couleurs.
En dessous, nous avons créé une table (table) contenant 8 lignes correspondant à des chaines de caractères indiquant dans l’ordre des tiles.
Ensuite vient la procédure drawmap(). Cette procédure est chargée de parcourir la table à l’aide de 2 boucles: la première correspondant au parcours de la ligne en X et l’autre au Y.
Pour poser la bonne tuile de notre tileset, nous utilisons la commande:
spr.pushSprite(j * WIDTH_TILE, i * HEIGHT_TILE, (nb - 1) * WIDTH_TILE, 0, WIDTH_TILE, HEIGHT_TILE);
Décomposons cette commande. Elle est composée de:
- spr (le nom de notre sprite contenant notre Tileset)
- pushSprite (la commande elle même qui indique que l’on va afficher notre sprite spr à l’écran qui comprend elle même ces éléments:
- j * WIDTH_TILE, i * HEIGHT_TILE: ce sont les coordonnées du coin supérieur gauche de où nous voulons que le sprite soit affiché à l’écran
- (nb - 1) * WIDTH_TILE, 0 : coordonnées du coin supérieur gauche de la section que nous voulons copier depuis le Tileset
- WIDTH_TILE, HEIGHT_TILE largeur et hauteur du bloc à copier depuis la position précédente dans le sprite
La procédure setup()
On initialise l’ESPBoy : myESPboy.begin(“Tile mapping”); Le logo de l’ESPBoy s’affichera avec le titre Tile mapping en dessous mais surtout cet appel s’occupe de remettre l’ESPBoy dans son état initial.
On indique SetColorph(4) afin d’indiquer à l’ESPB que nous allons travailler avec des graphismes aux couleurs 4 bits copiées
spr.createSprite(Tileset_size, HEIGHT_TILE); Permet de créer l’objet sprite (spr) de longueur: Tileset_size et de hauteur: HEIGHT_TILE
on utilise ensuite pushImage pour pousser le contenu de l’image dans le sprite (spr)
Je n’explique pas loop() car cette procédure qui se lance à chaque cycle est très simple: à chaque exécution. Elle lance la procédure drawmap() puis attends en fonction de la valeur indiquée dans DELAY
Voilà, nous avons atteint notre objectif, remplir l’écran avec 8 tuiles de 16 pixels de large par 16 pixels de haut. 16 pixels est une taille qui n’est pas choisie aux hasard: c’est un multiple de 8, c’est plus simple pour le “lire” en hexadécimal et ça facilite le traitement.
Tout le paramétrage de notre carte est dans le tableau table et nous le parcourons en dessinant la table en utilisant 2 boucles for (i représentant les lignes et j représentant les colonnes). La dimension des tuiles étant fixe, nous pouvons remplir notre quadrillage en allant chercher les informations à mettre dans la case en prenant la portion du tileset (ou ensemble de tuiles mais la traduction française est trop longue…) correspondant à la valeur indiquée dans le tableau. Comme nous avons mis toutes les tuiles en ligne, c’est très simple. Nous pourrions également avoir plusieurs lignes et dans ce cas, il faudrait gérer avec une petite équation la position dans le tileset de la tuile à afficher.
Bien maintenant que nous savons remplir l’écran avec de petites portions d’une image, réfléchissons un peu à la suite.
Tout d’abord une remarque: S’il y a plusieurs tableau ou si la carte est très grande, je vous conseille de la déplacer dans un fichier .h : ça n’encombrera pas votre programme principal, ça facilitera la lecture de votre carte et sa maintenance, l’ajout de niveaux supplémentaires, etc (d’ailleurs si vous avez de nombreux niveaux, n’hésitez pas à couper le fichier .h en plusieurs fichiers de tailles raisonnables qui vous éviterons d’avoir à parcourir trop de lignes lorsque vous voudrez modifier une valeur)
Enfin noté que nous utilisons dans notre programme les chiffres et les lettres (on a donc 35 tuiles utilisables) ce qui correspond à certains types de jeux mais nous pouvons aussi utiliser directement des valeurs pour utiliser par exemple 255 tuiles différentes. Si vous avez besoin de plus, vous pouvez bien sur utiliser des entiers plus grands mais pensez toutefois à la taille que prendra votre carte en mémoire. si vous dépassez 255, vous devrez utiliser 2 octets et la taille en mémoire de votre carte doublera. Normalement avec 255 tuiles, vous devriez déjà avoir de quoi faire pas mal de chose (il est rare, très rare même que des jeux en utilise plus)
Dans la prochaine étape, nous allons définir les propriétés des tuiles. Pour le moment, faisant une carte, nous allons faire simple: une tuile sera franchissable ou non franchissable… simple, je vous dit… On y va tranquille et surtout pour le moment, vous n’avez rien qui bouge donc pour ce prochain exemple, vous devrez me faire confiance aveuglément… J’aime ce pouvoir… (rire diabolique)