#include "PA.h" // On signale que l'on veut inclure la lib de chez PA... #include "gfx/ballon.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/ballon.pal.c" // Fond à charger qui sert à rien... Juste à faire joli quoi... #include "gfx/terrain.raw.c" // Fichier qui contient en fait les informations sur les tiles (carrés de 8x8) #include "gfx/terrain.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/terrain.pal.c" // Fichier qui contient la palette pour les fonds. #include "gfx/ciel.raw.c" // Fichier qui contient en fait les informations sur les tiles (carrés de 8x8) #include "gfx/ciel.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/ciel.pal.c" // Fichier qui contient la palette pour les fonds. ////////////////////////////////////////////////////////////////////// int x = 112; // coordonnée x des deux sprites int y = 112; // coordonnée y du sprite du bas float t = 0; // temps t float vi = 0; // vitesse initiale du ballon int y1 = 192; // coordonnée y du sprite du haut int xi = 0; int gravite(int y, float t, float vi){ // fonction gravité : y = 4.905*t*t + vi*t + y; // equation horaire de l'ordonné y = (int)y; // on met y comme un entier return y; } int mouv(int xi, float t){ x = x+xi; x = (int)x; return x; } // 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, ballon_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, ballon_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, terrain_Palette); PA_LoadPal(PAL_BG1, ciel_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*)ballon_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) PA_CreateSprite(1,0,(void*)ballon_Bitmap,OBJ_SIZE_32X32,1,0,x,y1); // 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 ! terrain_Tiles, // Nom des tiles (contenu dans fond.raw.c) terrain_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, ciel_Tiles, ciel_Map, BG_256X256, 1, 1); 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... PA_SetSpriteXY(0, 0, x, y); PA_SetSpriteXY(1, 0, x, y1); x = mouv(xi,t); if ((Stylus.Newpress)&&(Stylus.X >= x)&&(Stylus.X <= (x+6))&&(Stylus.Y > y)&&(Stylus.Y <= (y+32))){ // quand on clique : la vitesse initiale se remet à sa valeur d'origine, t aussi. vi = -10; // ce qui permet au ballon de monter t = 0; xi = 3; } if ((Stylus.Newpress)&&(Stylus.X >= (x+6))&&(Stylus.X <= (x+14))&&(Stylus.Y > y)&&(Stylus.Y <= (y+32))){ // quand on clique : la vitesse initiale se remet à sa valeur d'origine, t aussi. vi = -12; // ce qui permet au ballon de monter t = 0; xi = 2; } if ((Stylus.Newpress)&&(Stylus.X >= (x+16))&&(Stylus.X <= (x+18))&&(Stylus.Y > y)&&(Stylus.Y <= (y+32))){ // quand on clique : la vitesse initiale se remet à sa valeur d'origine, t aussi. vi = -13; // ce qui permet au ballon de monter t = 0; xi = 0; } if ((Stylus.Newpress)&&(Stylus.X >= (x+18))&&(Stylus.X <= (x+26))&&(Stylus.Y > y)&&(Stylus.Y <= (y+32))){ // quand on clique : la vitesse initiale se remet à sa valeur d'origine, t aussi. vi = -12; // ce qui permet au ballon de monter t = 0; xi = -2; } if ((Stylus.Newpress)&&(Stylus.X >= (x+26))&&(Stylus.X <= (x+32))&&(Stylus.Y > y)&&(Stylus.Y <= (y+32))){ // quand on clique : la vitesse initiale se remet à sa valeur d'origine, t aussi. vi = -10; // ce qui permet au ballon de monter t = 0; xi = -3; } /* ce qui suit permet la transition d'un ecran à l'autre*/ if(y >= 0){ y = gravite(y,t, vi); y1 = 192; } if((y <= 0)&&(y1 >= 160)){ y = gravite(y,t , vi); y1 = y+192; } if(y1 < 160){ y1 = gravite(y1,t, vi); y = -32; } /* ce qui suit permet de crée un sol(avec des rebonds) et un plafond*/ if(y >= 112){ y =112; t = 0.5; vi = vi+2; } if(vi >= 0){ vi = 0; xi=0; } if(y1 < 2){ t = t+1; y1 = 2; } if(x<1){ x=1; xi= -xi; } if(x>223){ x=223; xi= -xi; } t = t+0.1; // on incremente le temps // 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 suivante : PA_WaitForVBL(); } return 0; } //////////////////////////////////////////////////////////////////////