Développer sur DS - Jour 2

Publié le par ali banana

Ce tutorial a été réalisé par Mollusk pour www.playeradvance.org




Salut tout le monde !

Je vous offre ce soir un petit tuto en fait super long sur le dev DS, peut-etre plus adapté aux developpeurs Gba, mais sait-on jamais... Pour commencer, il vous faudra par contre installer et mettre en place l'environnement, et donc je vous invite à suivre pour cela le tuto suivant : http://www.playeradvance.org/index.php?showtopic=11160 de Beersleep... (à ce sujet, on pourrait le renommer jour 1 ?)

On va utiliser, pour faire simple, la petite lib PA_lib, qui se greffe en fait sur ndslib, mais ca on s'en fout, vous verrez bien...
Dans ce tuto, vous trouverez comment amorcer la lib, charger des sprites sur chaque écran, les déplacer en utilisant les touches et l'écran tactile, ainsi que l'affichage de texte, de fonds, et déplacer ces fonds !!! Beaucoup de choses en somme...

Vous allez pouvoir télécharger un fichier contenant tout ce qu'il faut (avec la lib, les images et tout) ici : http://membres.lycos.fr/existepas/PA en prenant le fichier PA.zip (contient le template plus le tuto dedans)

Il faut ensuite dezipper le tout dans le dossier projects/PA dans ndsdev... Et ouvre VC++ en cliquant sur dsdemo.vcproj... Là, on a la petite fenetre de gauche dans laquelle on 'expand' dsdemo, puis ARM9, puis Source files, et on ouvre main.cpp pour afficher tout le code. C'est commenté à mort et donc je vais pas plus le commenter ici, mais juste l'afficher...

Pour convertir les images, j'ai utilisé gfx2gba frontend, que je vous invite à récupérer ici :
http://membres.lycos.fr/existepas/gfx2gba/

Pour convertir les sprites, on ouvre gfx2gba frontend, puis on fait ouvrir l'image du sprite (dans arm9/gfx), et on coche les options suivantes :
user posted image
Le plus important est de bien cocher 'disable map output', pour signifier que c'est un sprite et non un fond...

On clique sur Process jusqu'à ce qu'il daigne afficher le texte... Puis on le ferme et on recommence pour le fond, avec ca :
user posted image
On coche les 3 options d'optimisation des tiles, et c'est parti !

Les sprites et fonds sont déjà convertis de base, mais je vous montre comment faire quand meme, je suis sympa ! wink.gif


On va maintenant pouvoir s'attaquer au code à proprement parlé :

CODE

#include "PA.h"   // On signale que l'on veut inclure la lib de chez PA...


#include "gfx/cruiser1.raw.c"  // Fichiers d'image... Contient les données à afficher. C'est un sprite de 16 couleurs

// Palette à charger en mémoire pour le sprite
#include "gfx/sprite.pal.c"

// Fond à charger qui sert à rien... Juste à faire joli quoi...
#include "gfx/fond.raw.c"  // Fichier qui contient en fait les informations sur les tiles (carrés de 8x8)
#include "gfx/fond.map.c"  // Fichier qui contient les infos sur comment arranger ces tiles en mémoire (on met le premier carré en haut à gauche, le deuxième à la suite, etc... Si un carré est en double, ca permet de ne pas charger 40 fois les memes images en mémoire, on économise donc beaucoup de place. C'est une carte...
#include "gfx/bg.pal.c"  // Fichier qui contient la palette pour les fonds.



//////////////////////////////////////////////////////////////////////
s16 x = 0;  // On va se faire 2 varialbes de position x et y histoire de...
s16 y = 0;
s16 bgx = 0;  // On va meme voir comment déplacer un fond avec ca...
s16 bgy = 0;


// On fait la fonction principale indispensable à tout programme...
int main(int argc, char ** argv) {


PA_Init(); // Initialise la lib. Ce doit etre le premier truc à mettre (sans faute). Si on veut tout remettre à 0 (sprites, fonds, etc..., on peut utiliser PA_Init n'importe ou)

PA_InitVBL(); // Initialise le VBL, ce qui en fait permet de copier en mémoire toutes les infos sur les sprites, met à jour les touches et reprend la position du stylet à chaque cycle, chaque frame, chaque image quoi... C'est pratique quand on débute (et meme après.

PA_LoadSplash();  // Comme on est sympa, on fait de la pub pour notre forum favori !

// Là c'est important, on charge les palettes pour les sprites... Si on ne charge pas les palettes, tout restera noir, donc faut le faire...
PA_LoadPal(PAL_SPRITE0, sprite_Palette);  //PAL_SPRITE0 c'est pour dire de mettre sur la palette pour l'écran du bas (0) et pour les sprites
PA_LoadPal(PAL_SPRITE1, sprite_Palette);  // PAL_SPRITE1 c'est pareil mais pour l'écran du haut. On charge la meme palette histoire de pas se faire chier, mais on pourrait avoir des sprites différents et des palettes différentes

// On charges pareil, pour les les fonds cette fois-ci...
PA_LoadPal(PAL_BG0, bg_Palette);
PA_LoadPal(PAL_BG1, bg_Palette);


// Histoire de pouvoir écrire à l'écran, on va initialiser aussi des fonctions de texte. On le met sur les 2 écrans (d'où le 1 de la première fonction et le 0 de la deuxième). Dans les 2 cas, on va le mettre sur le premier fond dispo, comme ils sont numérotés de 0 à 3, on va prendre le 0...
PA_InitText(1, 0); // Texte pour l'écran du haut
PA_InitText(0, 0); // Texte pour l'écran du bas

// Comme le fond est blanc, on va mettre le texte en noir :
PA_SetTextCol(0, 0, 0, 0); // 0 pour l'écran du bas, et les autres 0 pour les composantes R, G, B...
PA_SetTextCol(1, 0, 0, 0);

// On va maintenant créer notre premier sprite ! Je vais donc détailler chaque numéro pour savoir à quoi ca sert...
PA_CreateSprite(0,  // Ecran sur lequel l'afficher. 0 pour l'écran du bas. On en mettra un en haut aussi après
   0,  // Numéro du sprite que l'on veut, de 0 à 127 pour chaque écran. On va prendre le premier... A savoir : Sur DS, les sprites de petit numéro sont affichés au-dessus. Donc le 0 est au-dessus de tout sprite, puis le 1, etc... le 127 est tout au fond.
   (void*)cruiser1_Bitmap,   // Le nom des graphismes dans le fichier cruiser1.raw.c que l'on a converti. Il faut mettre (void*) devant pour pas avoir d'erreur de compilation, faut pas y faire attention;)
   OBJ_SIZE_32X32,   // Taille du sprite. Il faut toujours utiliser les macros OBJ_SIZE_8X8 par exemple, etc... Ca ne prend que les puissances de 2 à partir de 8 (8, 16, 32, et 64)
   1,  // Mode 16 ou 256 couleurs. 1 pour 256 (1 > 0) Si on se trompe là, ca fait une image bizarre...
   0,  // Si en mode 16 couleurs, on choisis la palette à utiliser (de 0 à 15). Dans notre cas, ca change rien
   0,   // Position X de base (0-511)
   0);  // Position Y de base (0-255)

// Et puis on va charger le meme mais sur l'écran du haut, et au milieu de l'écran.
PA_CreateSprite(1, 0, (void*)cruiser1_Bitmap, OBJ_SIZE_32X32, 1, 0, 112, 80);
x = 112;
y = 80;  // On va mémoriser ces coordonnées...


// Puis on charge un fond sur chaque écran. Attention, on a initialisé le texte sur le fond 0, donc on ne peut pas l'utiliser (sinon ca vire le texte). Donc on va utiliser le fond 3, le plus profond...
PA_LoadSimpleBg(0,   // Ecran... là c'est celui du bas
   3,   // Numéro du fond. On a dit qu'on prendrait le 3, donc on le fait !
   fond_Tiles,  // Nom des tiles (contenu dans fond.raw.c)
   fond_Map,    // Nom de la carte (contenu dans fond.map.c)
   BG_256X256,      // Taille du fond (on a 256X256, 256X512, 512X256, ou 512X512.
   1,             // Ca c'est WRAPAROUND, on s'en tape, ca ne sert QUE si on fait des fonds qui tourne, on verra ca un autre jour...
   1);    // Mode 16 ou 256 couleurs, comme pour les sprites... Nous c'est 256...

// Et puis on va charger le meme, mais pour l'écran du haut...
PA_LoadSimpleBg(1, 3, fond_Tiles, fond_Map, BG_256X256, 1, 1);    

// On va afficher un texte tout simple (SimpleText) sur l'écran du haut...
PA_OutputSimpleText(1,  // Ecran du haut
    0,  // Position X en tile (donc en multiple de 8). Si on met 1, ca affiche au 8ème pixel, etc
    0,  // Position Y, pareil...
    "        Hello World !!!"); // Et le texte à afficher

// On va voir qu'on peut aussi faire un texte plus complexe en affichant des variables et tout un peu plus loin...




while (1) {  // Ca s'est ce qu'on appelle la boucle principale, c'est là qu'on met l'ensemble des trucs à faire à chaque frame...

bgx += Pad.Held.Right - Pad.Held.Left;  // Ici on indique de faire varier bgx en fonction de comment on appuye sur les touches. Pad.Held signifie pressée (on a Newpress pour nouvelle pression et Released pour relaché), et Right et Left pour... gauche et droite ! Donc si on appuye à droite, ca fait +1, à gauche -1...
bgy += Pad.Held.Down - Pad.Held.Up;  // Pareil mais avec haut et bas...
// A noter : les touches sont Up, Down, Left, Right, A, B, L, R, et X et Y quand ca sera supporté par les emulateurs ou que j'aurai un passme...

PA_BGScrollXY(1,  // On va déplacer le fond de l'écran du haut...
     3,  // C'est le fond du fond que l'on prend, celui chargé tout à l'heure
     bgx,   // Nouvelle position X que l'on veut, que l'on a changée avec les touches
     bgy);  // Nouvelle position Y...


// On va maintenant déplacer le sprite du haut pareil que le fond...
x += Pad.Held.Right - Pad.Held.Left;
y += Pad.Held.Down - Pad.Held.Up;

PA_SetSpriteXY(1, // Ecran du haut
      0, // Numéro du sprite, soit le 0
      x, // Nouvelle position x
      y);  // Nouvelle position y




// Pour le sprite du bas, on ne va pas se géner, on va utiliser les fonctions de la DS : l'écran tactile !
PA_SetSpriteXY(0, 0, Stylus.X, Stylus.Y);  // On récupère les coordonnées avec Stylus.X et Stylus.Y... On peut aussi savoir si on fait une nouvelle pression avec Stylus.Newpress, si on est appuyé avec Held, et relaché avec Released...

// Maintenant qu'on a tout bougé, on n'a plus qu'à attendre la fin du cycle pour recommencer. Pour synchroniser le tout avec l'écran, on utiliser la fonction suiavnte :
PA_WaitForVBL();
// Et c'est tout !

}
 return 0;
}


//////////////////////////////////////////////////////////////////////



Voilà !! Maintenant, il ne reste plus qu'à faire Build-> Clean pour tout nettoyer bien comme il faut, puis F7 pour compiler...

Ensuite, on peut lancer la demo en allant dans le répertoire ARM9 et en chargeant arm9.bin dans Dualis ! C'est magique...

Ce message a été modifié par Mollusk le mercredi 25 mai 2005 à 20:31

Publié dans Tutoriaux

Pour être informé des derniers articles, inscrivez vous :

Commenter cet article

dissertation 05/01/2010 08:50


Blogs are so informative where we get lots of information on any topic. Nice job keep it up!!
_____________________

dissertation


supergrey 09/12/2005 12:11

Je n'arrive pas a utiliser ces librairie avec visual C++ 6 quand je compile un exemple ca me dit:
#error : Either ARM7 or ARM9 must be defined
Donc j'ai essayé de metre au début de main.cpp : #define ARM9
et la ca me dit:
c:\devkitpro\libnds\include\nds\jtypes.h(101) : error C2632: 'long' followed by 'long' is illegal
Bon comment je fais?