Je vais vous parler cette fois du système des sprites sur ma console préférée : la DS.
Tout d’abord qu’est-ce qu’un sprite?
C’est tout simplement un graphique qui se déplace sur l’écran.
Maintenant certaines consoles comme la DS nous fournissent un moyen simple de les gérer : le programmeur indique le graphique à utiliser et les informations du sprite (taille , position, effets ... ) et le moteur graphique s’occupe du reste ( déplacement et affichage sur un arrière-plan)
La DS est capable de gérer 128 sprites (de 0 à 127) par écran, ces sprites peuvent avoir une dimension de 8 pixels jusqu’à 64 pixels en largeur et en hauteur, et un nombre variable de 16, 256 ou 32768 de couleurs.
Pour cela le système graphique mets à notre disposition trois emplacements mémoires distincts pour chacun de ses deux écrans :
Je commence par la mémoire des graphiques car c’est à la fois le plus simple et le plus compliqué.
Cette mémoire se situe à l’adresse 0×6400000 pour l’écran principal et 0×6600000 pour le secondaire.
La libnds a donné les macros suivantes pour ces adresses :
#define SPRITE_GFX ((uint16*)0×6400000)
#define SPRITE_GFX_SUB ((uint16*)0×6600000)
ce qui ma foi est assez explicite.
La taille de la mémoire peut aller de 16k à 256k pour l’écran principal, et de 16k à 128k pour l’écran secondaire suivant la gestion des “bank” mémoires.
Plutôt que de stocker l’adresse mémoire du bitmap (ou gfx) du sprite dans le tableau d’informations des sprites, Nintendo a choisi de stocker le “numéro” du graphique.
“Euh mais je fais comment avec mon sprite 32×32?”
Et bien comme le plus petit sprite possible est 8×8 ( 8 pixels de large sur 8 de hauteur) ce sera l’unité .
Par exemple supposons que j’ai 2 sprites de 16×16 à stocker , le premier aura comme numéro de graphique 0, le second lui aura comme numéro 4 car un sprite 16×16 occupe l’espace de 4 sprites 8×8.
“Ah d’accord mais j’ai un sprite 16 couleurs et un de 256 couleurs je fais comment ?”
Là ça se complique ...
Supposons que nous avons un sprite A 16×16 de 16 couleurs
et un sprite B de 16×16 de 256 couleurs
Si nous mettons en mémoire les graphiques de A puis B, alors le sprite A aura comme numéro de graphique 0, B lui aura comme numéro de graphique 2 car le sprite A occupe 2 sprites 8×8 en 256 couleurs ...
Si nous inversons en mémoire B et A , alors B aura comme numéro 0, et A lui aura comme numéro 8 car le sprite B occupe l’espace de 8 sprites 8×8 4bit ...
| Décalage mémoire | Mode couleurs | ||||||||
| hexa | decimal | 16 | 256 | 32768 | cas a) | cas b) | |||
| 0000 h | 0000 | ||||||||
| 0020 h | 0032 | gfx 4bit N° 0 | gfx 8bit N° 0 | gfx 16bit N° 0 | |||||
| 0040 h | 0064 | gfx 4bit N° 1 | |||||||
| 0060 h | 0096 | gfx 4bit N° 2 | gfx 8bit N° 1 | ||||||
| 0080 h | 0128 | gfx 4bit N° 3 | |||||||
| 00A0 h | 0160 | gfx 4bit N° 4 | gfx 8bit N° 2 | gfx 16bit N° 1 | |||||
| 00C0 h | 0192 | gfx 4bit N° 5 | |||||||
| 00E0 h | 0224 | gfx 4bit N° 6 | gfx 8bit N° 3 | ||||||
| 0100 h | 0256 | gfx 4bit N° 7 | |||||||
| 0120 h | 0288 | gfx 4bit N° 8 | gfx 8bit N° 4 | gfx 16bit N° 2 | |||||
| 0140 h | 0320 | gfx 4bit N° 9 | |||||||
| 0160 h | 0352 | gfx 4bit N° 10 | gfx 8bit N° 5 | ||||||
| 0180 h | 0384 | gfx 4bit N° 11 | |||||||
| 01A0 h | 0416 | gfx 4bit N° 12 | gfx 8bit N° 6 | gfx 16bit N° 3 | |||||
| 01C0 h | 0448 | gfx 4bit N° 13 | |||||||
| 01C1 h | 0449 | gfx 4bit N° 14 | gfx 8bit N° 7 | ||||||
| 01C2 h | 0450 | gfx 4bit N° 15 | |||||||
La DS gère plusieurs tailles de sprites, mais il faut vous rappeler que ces tailles sont quand même spécifique. Les seuls tailles sont 8, 16, 32, et 64 pixels de haut et de large. Toutes les tailles ne sont quand même pas possible, voilà les différentes tailles utilisables (la largeur est prise horizontalement, la hauteur verticalement...) :
| 8 | 16 | 32 | 64 | |
|---|---|---|---|---|
| 8 | 8×8 | 16×8 | 32×8 | |
| 16 | 8×16 | 16×16 | 32×16 | |
| 32 | 8×32 | 16×32 | 32×32 | 64×32 |
| 64 | 32×64 | 64×64 |
Vous pouvez utiliser toutes les tailles hormis 64×8, 64×16, 16×64, et 8×64...
Euh... Je fais comment si mon sprite ne fait pas une de ces tailles ? Vous allez obtenir un magnifique sprite super crade et moche... Il y a une façon simple de contourner ce problème : utiliser un logiciel de dessin, juste mettre la taille de l’image à une taille adaptée pour la DS. Par exemple, si vous avez un sprite de 48×48, vous pouvez agrandir la taille du carré à 64×64 ! La même chose pour du 10×64 que vous devrez mettre en 32×64!