Fadest (./18) :
Pour tes problèmes de performances, je pense qu'il va falloir que tu te penches sur le concept de liste de sprites chainés.
Ca te permettra d'améliorer considérablement ton animation.
Il doit y avoir des topics/tutos sur le sujet sur le forum ou peut-être ici http://fadest.free.fr/spip ou j'avais +/- compilé divers articles...
J'ai fait un petit code qu'il sera plus facile de travailler, pour la mise en place d'une liste de sprites chainés. L'idée c'est de cloner roméo, un chat d'un manga sympathique des années 80s (embrasse moi lucile)
exe:
Fichier joint : romeo.o/*
Clonage/liste chainée version 0.1 - LYNX
01/11/2010
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
char SCREEN[8160] at (MEMTOP-16320);
char RENDER[8160] at (MEMTOP-8160);
// ------------------------------------
extern char fond1[];
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
// ------------------------------------
char romeo[]; //
extern char om000000[];
extern char om000001[];
extern char om000002[];
extern char om000003[];
extern char om000004[];
extern char om000005[];
char *romeotab[6] = {om000000, om000001, om000002, om000003, om000004, om000005};
char SCBromeo[]; // déclaration d'un nouveau controleur de sprite, moteur à hélice
#asm
_SCBromeo dc.b $c7,$10,$20
dc.w 0,0
dc.w 0,0,$100,$100
dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef
#endasm
// ------------------------------------
int posx,posy;
int i;
int tempa,aromeo,drap1;
// 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.
//DrawFBox(0,0,160,102,0);
SCBX(SCB) = 0;
SCBY(SCB) = 0;
SCBDATA(SCB) = fond1;
/**************************************************************************
** BOUCLE PRINCIPALE **
**************************************************************************/
for( ; ; )
{
SCBX(SCB) = posx;
SCBY(SCB) = posy;
DrawSprite(SCB);
if (joystick & JOY_RIGHT) // direction Droite
posx++;
if (joystick & JOY_LEFT) // direction Gauche
posx--;
if (joystick & JOY_UP) // direction Haut
posy--;
if (joystick & JOY_DOWN) // direction Bas
posy++;
if (posx<-160) posx=-160; // limit va à gauche
if (posx>0) posx=0; // limit va à gauche
if (posy>0) posy=0; // limit haut
if (posy<-102) posy=-102; // limit bas
// animation
if (drap1==0)
{
++tempa; // animation de romeo
if (tempa>20) {drap1=1;tempa=0;}
}
if (drap1==1)
{
++tempa; // animation de romeo
if (tempa>10)
{
tempa=0;++aromeo;
if (aromeo>5) {aromeo=0;drap1=0;}
}
}
SCBDATA(SCBromeo) = romeotab[aromeo%6];
// tentative de cclonage de roméo :
// SCBNEXT(SCBromeo)
SCBX(SCBromeo) = posx;
SCBY(SCBromeo) = posy;
DrawSprite(SCBromeo);
Vsync();
SwapBuffers();
}
/**************************************************************************
** FIN de la BOUCLE PRINCIPALE **
**************************************************************************/
}
Le logiciel peut choisir de ne pas avoir de buffer de collision et dégage ainsi 8Koctets de RAM supplémentaire pour le jeu. On peut définir individuellement les sprites comme n'étant pas sujet aux collisions et ainsi réduire le temps nécessaire au dessin. Comment fait-on pour désactiver ce buffer de collision ?