IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Programmation de la Game Boy Advance : les tiles 1/3 et les fenêtres

Attention, voici l'un des aspects les plus importants de la programmation sur GBA : les backgrounds.

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

1. Introduction

L'étape précédente de notre découverte de l'architecture de la GameBoy Advance nous avait conduit à l'étude des effets spéciaux câblés dans la machine. En outre, nous avions conclu sur l'utilisation théorique des fenêtres. Avant de poursuivre, appréhendons un exemple d'emploi concret de ces fenêtres.

2. Faire naître les effets

Dans le code source de l'exemple précédent, le joueur se voyait octroyé la possibilité de diriger un sprite de vaisseau spatial en transparence au dessus d'une image de notre planète. Nous nous proposons de réemployer cet exemple et de lui ajouter une fenêtre. La fenêtre en question, centrée sur l'avatar virtuel du joueur, suivra le sprite en mouvement et masquera tout autre pixels que ceux situés aux alentours dudit sprite. Ainsi, l'écran sera entièrement noir, hormi une petite zone rectangulaire encadrant le joueur. La première opération consiste à déclarer l'utilisation de la fenêtre. Au coeur de la méthode initGame() se trouve l'instruction d'initialisation du mode graphique, relativement complexe. Le mode graphique doit donc être altéré pour favoriser l'utilisation de la première fenêtre. Le programmeur a à sa disposition deux fenêtres graphiques distinctes. Toutefois, l'emploi de la première nous épargne le procédé de décalage binaire lors de certaines opérations.

 
Sélectionnez
REG_DISPCNT = MODE_4 | BG2_ENABLE | OBJ_ENABLE | OBJ_MAP_1D | WIN0_ENABLE;

Outre la définition du mode graphique fenêtré, le nouveau programme doit nécessairement définir les entités affichables par la fenêtre. Dans le cas contraire, absolument rien ne transparaîtra.

 
Sélectionnez
REG_WININ = WIN0_SPRITES | WIN0_BG2 | WIN0_BLENDS;
REG_WINOUT = 0;

La première ligne confère la possibilité d'afficher des sprites, le background numéro 2 et des effets spéciaux au sein de la fenêtre. La seconde ligne indique à la machine de ne rien afficher à l'extérieur de la fenêtre. Combiné avec les backround et les tiles, ceci offre l'opportunité de réaliser des effets intéressants en sélectionnant précisément les éléments à afficher. Ainsi, pour donner l'illusion d'un joueur marchant sur un chemin invisible n'apparaissant que dans une portion d'écran autour de lui, le programmeur pourra écrire :

 
Sélectionnez
REG_WININ = WIN0_SPRITES | WIN0_BG1 | WIN0_BG2;
REG_WINOUT = WIN0_SPRITES | WIN0_BG2;

Le drapeau WINx_BLENDS garantit l'activation ou la désactivation aisée des effets spéciaux. Enfin, une taille doit se voir attribuée à la fenêtre. A cet effet, les macros LEFT(), RIGHT(), TOP() et BOTTOM() seront invoquées afin de définir les coins de la fenêtre. Notez par ailleurs que le code source proposé le mois dernier comportait une erreur rendant inutilisables ces macros. Voici les deux versions, la seconde correspondant à la correction :

 
Sélectionnez
#define LEFT(n) (n * 8) << 8
#define LEFT(n) (n) << 8

Pour suivre le mouvement du joueur, le code relatif au changement de dimensions de la fenêtre prend place dans la fonction getInput(), chargé de gérer les touches de la console. Deux registres suffisent à modifier les extrémités gauche et droite puis haute basse :

 
Sélectionnez
REG_WIN0H = LEFT(xwing->x) | RIGHT(xwing->x + 64);
REG_WIN0V = TOP(xwing->y)  | BOTTOM(xwing->y + 64);

Si l'effet visuel obtenu ne se révèle pas particulièrement époustouflant, n'oubliez pas que les fenêtres pourront vous rendre de grands services lors de la composition de scènes complexes.

3. Les tiles

Une grande majorité de jeux vidéos "classiques" (entendez par là, de jeux en 2D, même si F-Zero ou Mario Kart fonctionnent sur le même principe) font usage des tiles dans l'optique de générer de grandes cartes de jeu ou d'imposants décors. La génération de surfaces composées de tiles sur une GameBoy Advance requière deux choses différentes : les tiles, qui correspondent à de petits bitmaps de 8 pixels par 8 en 256 ou 16 couleurs, et la map. Lorsque tous les tiles ont été chargés en mémoire, la machine peut interpréter le contenu de la map afin d'afficher le monde. La map désigne un tableau dont chaque élément désigne un tile à afficher. De la sorte, vous pourrez composer une mosaïque de votre environnement. Les tiles se révèlent d'autant plus utiles que le matériel de la GameBoy Advance confère la possibilité de pratiquer les opérations suivantes dessus : rotations, mises à l'échelle, transparences, changements d'orientation des tiles et création de quatre backgrounds.

Un background décrit une surface sur laquelle sera dessinée une map donnée. Le statut des backgrounds dépend directement du mode graphique actif. Une occasion pour nous de revenir sur ces derniers et de nous intéresser, enfin, aux modes 0, 1 et 2. Le tableau numéro 1 présente les modes graphiques et leurs incidences sur les backgrounds. Un background ne pouvant être affecté par les opérations de rotation et/ou de mise à l'échelle se voit désigné comme un "text background".

  Mode 0 Mode 1 Mode 2
Backgrounds disponibles Les quatre 0, 1 et 2 2 et 3
Rotation/Mise à l'échelle Non Background 2 Backgrounds 2 et 3

En outre, les backgrounds en mode "texte" peuvent employer jusqu'à 1024 tiles différents, en 256 ou 16 couleurs. Le programmeur obtient l'opportunité de renverser les tiles horizontalement ou verticalement, évitant ainsi la création en mémoire de bitmaps différents pour un même tile renversé suivant diverses orientations. Les backgrounds en mode "rotation" emploient au maximum 256 tiles en 256 couleurs. Le mode de background sélectionné a une incidence sur la taille de la map en pixels. Ainsi le mode "rotation" crée des maps de 128 pixels par 128, de 256 par 256, de 512 par 512 ou de 1024 par 1024. De la même manière, le mode "texte" laisse employer des maps de 256 pixels par 256, 512 par 256, 256 par 512 ou 512 par 512.

Les données des tiles se répartissent entre quatre "character base blocks". Chacun de ces blocs occupe 16 ko en VRAM, pour un total de 64 ko. Un background peut faire appel aux données de n'importe quel bloc. Les données de la map sont quant à elle réparties dans 32 "screen base blocks" de 2 ko chacun.

Chaque tile occupe 64 octets en mémoire (puisqu'un tile possède une taille de 8 pixels par 8). Il suffit pour charger des tiles en 256 couleurs de les placer les uns derrière les autres tous les 64 octet (l'adresse d'origine des "character base blocks" étant 0x60000000). En mode 16 couleurs, les tiles n'occupent que 32 octets. Le format des tiles en mémoire correspondant exactement à celui des sprites, nous pouvons sans aucun problème utiliser des outils de découpage de sprites pour générer des tiles. Les données de la map se voient caractérisées différemment. En mode "rotation", chaque entrée de la map occupe 1 octet (puisque l'on ne peut employer que 256 tiles différents). En mode "texte", chaque entrée de la map occupe 16 bits parmi lesquels : le numéro du tile sur les 10 premiers bits (1024 tiles distincts), le renversement horizontal sur le 11° bit, le renversement vertical sur le 12° et le numéro de palette sur les 4 bits restant (pour le mode 16 couleurs).

4. Téléchargements

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 Romain Guy. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.