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...