Tutoriel sur les sprites de la DS

Introduction

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 :

  • La mémoire des graphiques (ou bitmaps) des sprites
  • La zone mémoire réservée aux palettes des sprites (redéfinissable)
  • Le tableau des informations des sprites ou OAM

Structure mémoire graphique OAM

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

Tailles Possibles

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!

 
dssprite.txt · Dernière modification: 23/02/2008 00:18 par arialia
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki