Bonsoir,
J'ai réussi grâce à Fadest, à afficher le shiplayer, et il y a même un scrolling maintenant !
Tout fonctionne, mais j'ai de plus en plus de messages d'erreurs, et j'ai besoin d'aide pour y remédier.
problème résolu (oubli de point virgule et oubli de déclaration du sprite 1)
Pour ceux qui veulent tester cette version 0.1 (appui sur option1 pour démarrer):
Fichier joint : test.o
je remet ici les fichiers joint d'images au cas où, plus 2 nouvelles:
Fichier joint : sprite1.bmp
Fichier joint : sprite2.bmp
Fichier joint : fond1.bmp
Fichier joint : fond2.bmp
code corrigé:
/*
Glob Shoot - LYNX
25/10/2010
console tenu à la verticale
Handy/Option/Rotate Screen(Right)
D-pad et bouton option 1
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_LEFT 0x02
#define BUTTON_RIGHT 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 fond2[]; // image decor monde 1, d'une taille de 32*102; il faudra donc scroller 6 images de droite à gauche.
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
char sprite1[];
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[6] = {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
// variable (int = 2 octets ; char = 1 octet)
int posx,posy; //
int i;
int compteur,scrollx;
char tempa,etape,tempb; // de -128 à 127
// assembler vertical retrace syncronisation routine
void Vsync()
{
#asm
vretrace:
lda $fd0a
bne vretrace
#endasm
}
/**************************************************************************
** **
** **
**************************************************************************/
char main()
//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) = 58;
SCBY(SCBsprite2) = 52;
SCBDATA(SCBsprite2) = sprite2;
for(;;) // boucle principale
{
// *********************************************************************************************
if (etape==0) // écran titre
{
DrawSprite(SCB); // affichage fond1
if (joystick & BUTTON_OPTION1)
{
etape=1;
SCBDATA(SCB) = fond2;
}
}
// *********************************************************************************************
if (etape==1) // monde 1 : affichage de 6 images pour le décors, et les 2 images du shiplayer.
{
++tempb; // vitesse defilement du decor
if (tempb>=2)
{
tempb=0;
scrollx++;
}
if (scrollx==32) scrollx=0; // l'image fond2 : 32 pixels de large, donc remise à 0 si égale à 32.
for (compteur = 0 ; compteur < 6 ; compteur++) // de 0 à 5, ce qui fait 6. Grâce à la boucle for...
{
SCBX(SCB) = compteur*32; // ...on incrémente la position X de chaque nouvelle image...
SCBX(SCB)=SCBX(SCB)-scrollx;
DrawSprite(SCB); // ... et ainsi on affiche 6 fois la même image (taille: 32*102) l'une àprès l'autre, à un intervalle de 32.
}
if (joystick & JOY_RIGHT) posx++; // direction Droite
if (posx>120) posx=120;
if (joystick & JOY_LEFT) posx--; // direction Gauche
if (posx<2) posx=2;
if (joystick & JOY_UP) posy--; // direction Haut
if (posy<2) posy=2;
if (joystick & JOY_DOWN) posy++; // direction Bas
if (posy>76) posy=76;
// sprite 1 du shiplayer: moteur à hélice (6 images d'une taille de 8*22 chacunes)
SCBX(SCBsprite1) = posx;
SCBY(SCBsprite1) = posy;
// clip du sprite 1
SCBDATA(SCBsprite1) = sprtab[t%6];
++tempa; // vitesse animation de l'hélice
if (tempa>=3)
{
tempa=0;
++t;
}
// rappel: Le sprite 2 (coque) est lié au sprite 1 (hélice).
SCBX(SCBsprite2) = posx+8;
SCBY(SCBsprite2) = posy;
DrawSprite(SCBsprite1);
}
// *********************************************************************************************
Vsync();
SwapBuffers();
}
}