21Fermer23
philip-lynxLe 01/11/2010 à 02:56
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:
tromb 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 ?