1Fermer3
FadestLe 15/10/2010 à 09:18
Si tu as une animation, il faut que tu fasses découper ton fichier BMP en 6 objets par :
SPRPCK -t6 -S008022 -r006001 -o000000 -i048022 -p0 sprite1.bmp sp

ou :
-t6 indique qu'il s'agit d'un fichier BMP
-S008022 indique la taille d'un sprite
-r006001 indique le nombre de sprites à générer par ligne et colonne
-o000000 est un offset permettant d'indiquer ou commence le premier sprite dans le fichier image
-i048022 est la taille du fichier à découper
-p0 pour dire qu'il faut découper au format objet compatible C
sprite1.bmp est ton fichier en entrée
sp est la racine de tes fichiers en sortie. Tu est limité à 2 caractères à cause des vieilles limitations MS-DOS (8.3), En effet, SPRPCK va te générer 6 fichier .OBJ sous la forme spAAABBB.obj

Si tu fais SPRPCK sans option, il t'affiche l'aide.
SPRPCK > aide.txt te la sauvegardera dans un fichier texte à conserver précieusement.


Je te conseille de jeter un oeil au pack graphique de Yastuna2 que j'avais mis en ligne. Outre tous les fichiers graphiques, il y a surtout tous les fichiers .txt de découpage des planches de sprites avec SPRPCK. Ca peut être utile pour comprendre comment ça marche
Edit : je ne trouvais plus le lien sur la pacge yastuna, mais il est toujours en ligne :
http://fadest.free.fr/Yastuna2/Download/yastuna2_graphic_pack.zip


Du coup, ton source devient quelque chose du genre /* Glob Shoot - LYNX 14/10/2010 clip d'une image LYNX-image */ #include <stdlib.h> #include <lynx.h> #include <lynxlib.h> #include "inc\fond1.pal" // Ceci sert à inclure le fichier palette généré par sprpck /* LYNX-specific #defines: */ #define JOY_RIGHT 0x10 #define JOY_LEFT 0x20 #define JOY_DOWN 0x40 #define JOY_UP 0x80 #define BUTTON_OPTION1 0x08 #define BUTTON_OPTION2 0x04 #define BUTTON_INNER 0x02 #define BUTTON_OUTER 0x01 #define BUTTON_PAUSE 0x01 #define SC BSTRETC H(a) (*(uint *)((a)+15)) // déformation, macro #define SC BTILT(a) (*(uint *)((a)+17)) // déformation, macro char SCREEN[8160] at (MEMTOP-16320); char RENDER[8160] at (MEMTOP-8160); extern char fond1[]; // ecran titre extern char SCB[]; #asm _SCB dc.b $c0,$10,$20 dc.w 0,0 dc.w 0,0,$100,$100 dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef #endasm // déclaration des objets sprites qui seront linkés extern char sprite2[]; // coque (taille: 30*24) // A partir du sprite1, je souhaite obtenir 6 images, de 0 à 5, du moteur à élice : // clip du sprite 1 : lignes suivantes désactivées car bug extern char sp000000[]; extern char sp000001[]; extern char sp000002[]; extern char sp000003[]; extern char sp000004[]; extern char sp000005[]; char *sprtab[5] = {sp000000, sp000001, sp000002, sp000003, sp000004, sp000005}; extern char SCBsprite1[]; // déclaration d'un nouveau controleur de sprite, moteur à hélice extern char SCBsprite2[]; // déclaration d'un nouveau controleur de sprite, coque #asm _SCBsprite1 dc.b $c7,$10,$20 dc.w _SCBsprite2,0 dc.w 0,0,$100,$100 dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef _SCBsprite2 dc.b $c7,$10,$20 dc.w 0, _sprite2 dc.w 0,0,$100,$100 dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef #endasm // variavle (int = 2 octets ; char = 1 octet) int posx,posy; int i; // assembler vertical retrace syncronisation routine void Vsync() { #asm vretrace: lda $fd0a bne vretrace #endasm } /************************************************************************** ** ** ** ** **************************************************************************/ char main() { InitIRQ(); CLI; SetBuffers(SCREEN, RENDER ,0); /* set the palette */ SetRGB(pal); // Ceci sert à changer la palette de la Lynx (16 couleurs). DrawFBox(0,0,160,102,0); SCBX(SCB) = 0; SCBY(SCB) = 0; SCBDATA(SCB) = fond1; // coordonnées X et Y du shiplayer: moteur à hélice : SCBX(SCBsprite1) = 0; SCBY(SCBsprite1) = 0; SCBDATA(SCBsprite1) = sprite1; posx = 50; posy = 50; // coordonnées X et Y du shiplayer: coque : SCBX(SCBsprite2) = 50+8; SCBY(SCBsprite2) = 50+2; SCBDATA(SCBsprite2) = sprite2; // posx = 50; // posy = 50; for( ; ; ) { DrawSprite(SCB); // affichage fond1 if (joystick & JOY_RIGHT) posx++; // direction Droite if (posx>112) posx=112; if (joystick & JOY_LEFT) posx--; // direction Gauche if (posx<0) posx=0; if (joystick & JOY_UP) posy--; // direction Haut if (posy<0) posy=0; if (joystick & JOY_DOWN) posy++; // direction Bas if (posy>80) posy=80; // shiplayer: moteur à hélice (6 images d'une taille de 8*22 chacunes) SCBX(SCBsprite1) = posx; SCBY(SCBsprite1) = posy; // clip du sprite 1 : lignes suivantes désactivées SCBDATA(SCBsprite1) = sprtab[t%5] if (key == BUTTON_OPTION1) { if (t==0) t = 4*9; --t; } if (key == BUTTON_OPTION2) { if (t==4*9-1) t = -1; ++t; } SCBX(SCBsprite2) = posx+8; SCBY(SCBsprite2) = posy; DrawSprite(SCBsprite1); // shiplayer: coque // SCBX(SCBsprite2) = posx+8; // SCBY(SCBsprite2) = posy; // DrawSprite(SCBsprite2); Vsync(); SwapBuffers(); } }

Note, j'ai viré l'affichage de SCBsprite2 parce qu'en fait, si tu regardes bien la déclaration de SCBsprite1, il est chainé vers SCBsprite2. Ce qui veut dire que l'affichage de SCBsprite1 provoquera également l'affichage de SCBsprite2.

J'ai pas de quoi compilé ou tester, donc il est fort probable qu'il y ait quelques soucis par endroit...