#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; }
//////////////////////////////////////////////////////////////////////
|