1

Bonsoir,

je souhaite adapter un jeu que j'ai fais avec The game factory il y a quelques années, Glob shoot, sur console:
glob01grand.gif
glob02grand.gif


Pour afficher l'animation de l'hélice du shiplayer, j'ai fait une petite planche de sprite, 6 images de l'hélice en mouvement, chacune d'une taille de 8*22:
tromb Fichier joint : sprite1.bmp
tromb Fichier joint : sprite2.bmp
Mais j'ai désactivé les ligné inspiré d'un source sprdemo3.c car je n'y arrive pas :
source sur ce site : http://www.mdgames.de/lynx_eng.htm

/* 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 sprite1[]; // moteur à hélice (6 images d'une taille de 8*22 chacunes, placées de gauche à droite) 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 sprite1000000[]; //extern char sprite1000001[]; //extern char sprite1000002[]; //extern char sprite1000003[]; //extern char sprite1000004[]; //extern char sprite1000005[]; //char *sprtab[5] = {sprite1000000, sprite1000001, sprite1000002, sprite1000003, // sprite1000004, sprite1000005}; 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,_sprite1 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; // } DrawSprite(SCBsprite1); // shiplayer: coque SCBX(SCBsprite2) = posx+8; SCBY(SCBsprite2) = posy; DrawSprite(SCBsprite2); Vsync(); SwapBuffers(); } }
avatar
Travaux, concept of proof, divers :
Megadrive
topics/172-143753-moved-juju-densetsu
Lynx
sections/255-developpeurs-lynx

2

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...
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2022 ?
https://yastuna-games.com

3

Merci beaucoup, c'est plus clair maintenant ! smile
Fadest (./2) :
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



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


Il y a en effet 4 problèmes, d'abord à la ligne 109 et 142 : undefined sympbol

109 posx = 50
142 SCBDATA() = sprtab[t%6]

j'ai mis 6 au lieu de 5 car il y a 6 images, mais ça règle pas le problème.



144 if (key == BUTTON_OPTION1)

cette condition pose doublement problème (mising semicolon et undefined sympbol)


Il y a quand même un fichier test.o qui se créer. On voit l'image de fond, et le vaisseau assemblé, ce qui est déjà bien. Les boutons option1 et option2, pour activer l'anim de l'hélice, ne fonctionnent pas.
avatar
Travaux, concept of proof, divers :
Megadrive
topics/172-143753-moved-juju-densetsu
Lynx
sections/255-developpeurs-lynx

4

109 posx = 50
142 SCBDATA() = sprtab[t%6]

Il te manque un ; à la fin de chacune de ces 2 lignes...
Du coup, ça peut déclencher des erreurs aussi plus loin (la ligne 144 par exemple)
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2022 ?
https://yastuna-games.com

5

Bonsoir,

J'ai réussi grâce à Fadest, à afficher le shiplayer, et il y a même un scrolling maintenant ! wink

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)

Pumy

Pour ceux qui veulent tester cette version 0.1 (appui sur option1 pour démarrer):tromb Fichier joint : test.o

je remet ici les fichiers joint d'images au cas où, plus 2 nouvelles:
tromb Fichier joint : sprite1.bmp
tromb Fichier joint : sprite2.bmp
tromb Fichier joint : fond1.bmp
tromb 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(); } }
avatar
Travaux, concept of proof, divers :
Megadrive
topics/172-143753-moved-juju-densetsu
Lynx
sections/255-developpeurs-lynx

6

Nice Project
The Errors are in the lines the compiler calls you

Line 112 you are using posx and posy the vars are not declared
you have to insert in your declaration Block
uchar posx,posy;

Line 147, in the line before (144)you forgot the ;
144 scrollx;

Line 152, means you forgot a ; in Line 151
SCBX(SCB)=SCBX(SCB)-scrollx;

in Line 173 you use t as variable. but i think its not declared, you should add
char t;
or
uchar t;
but you use t nowehre else... so think about what value you would check with it.

the last error means you forgot a closing bracket }
i think its the closing bracket from the for(;wink in line 120
so add a closing bracket at line 194

Regards
Matashen



7

En fait, il semblerait qu'il y ait un décalage entre les lignes du script yn et les erruers.
Je dirais que sprite1 n'est pas déclaré (posx l'est par contre)
Pour le }manquant, c'est soit le for qui ne termine pas comme le dis matashen, soit le if (etape==1)
Mais il manque une fermeture de pavé dans ton source

[HS]
Hi Matashen,
Do you go to the E-jagfest in Kaarst in November, I hope to meet you and Bernd here...
[/HS]
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2022 ?
https://yastuna-games.com

8

No sorry, to many workload.

hope to see all at AC2011

9

Bonsoir,

J'ai apporté les corrections, il n'y a plus de messages d'erreur, merci, thanks smile

Je voudrais savoir comment faire une procédure : c'est une partie de code indépendante du code principal, qui peut avoir avoir des paramètres, et éventuellement ses propres variables.

exemple (avec purebasic)

Avant la boucle principale:
Declare Fetoile(x,y,classe)

Dans la boucle principale:
Fetoile(10,10,0)

Hors de la boucle principale:
Procedure.i Fetoile(x,y,classe)

là il y a du code, par exemple une liste chainé pour la fabrication ou l'affichage d'un champs d'étoiles...

EndProcedure
avatar
Travaux, concept of proof, divers :
Megadrive
topics/172-143753-moved-juju-densetsu
Lynx
sections/255-developpeurs-lynx

10

tu la déclare comme une fonction qui ne retourne pas de paramètre...


Déclaration
void Fetoile(uchar x, uchar y, uchar classe){
//ton code
}


Utilisation
Fetoile(10,10,0);
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

11

vince (./10) :
tu la déclare comme une fonction qui ne retourne pas de paramètre...


Déclaration
void Fetoile(uchar x, uchar y, uchar classe){
//ton code
}


Utilisation
Fetoile(10,10,0);

après
void Vsync() { #asm vretrace: lda $fd0a bne vretrace #endasm }

j'ai placé
void Fchiffres (uchar x, uchar y, uchar classe) { // }
J'ai 7 syntax error lol
J'ai remplacé les uchar, par char tout court, mais même résultat.
avatar
Travaux, concept of proof, divers :
Megadrive
topics/172-143753-moved-juju-densetsu
Lynx
sections/255-developpeurs-lynx

12

Essaye plutôt :

void Fchiffres (x, y, classe)
uchar x, uchar y, uchar classe; // déclarer les variables en paramètres avant le début du bloc de code { ... }
{
//
}

Je crois que le C du kit BLL n'accepte pas les déclarations des paramètres directement.
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2022 ?
https://yastuna-games.com

13

voici le code qui marche: void Fchiffres(x,y,classe) int x; int y; int classe; { SCBDATA(SCBchiffres) = chiffrestab[classe%12]; SCBX(SCBchiffres) = x; SCBY(SCBchiffres) = y; DrawSprite(SCBchiffres) }

puis je place dans la boucle principale :
Fchiffres(80,47,11);

merci les amis !
boing
avatar
Travaux, concept of proof, divers :
Megadrive
topics/172-143753-moved-juju-densetsu
Lynx
sections/255-developpeurs-lynx

14

La version 0.2 vient d'arriver ! La conversion se passe bien, c'est encore une version ou je cherche mes repères, mais ça commence à prendre forme smile
beauregard (./5) :
je remet ici les fichiers joint d'images au cas où, plus 2 nouvelles:
tromb Fichier joint : sprite1.bmp
tromb Fichier joint : fond2.bmp

mise à jour et nouvelles images pour la version 0.2 du jeu Glob shoot:
tromb Fichier joint : fond1.bmp
tromb Fichier joint : fondlvl.bmp
tromb Fichier joint : sprite2.bmp
tromb Fichier joint : chiffres.bmp
tromb Fichier joint : jauge.bmp

exe version 0.2 (à tester sur votre émulateur préféré):
tromb Fichier joint : globshoot_02.o

code source:/* Glob Shoot version 0.2 - LYNX 27/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 fondlvl[]; // image fond level, d'une taille de 32*102; 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 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 // ------------------------------------ char chiffres[]; // // clip du sprite chiffres: 0123456789.L extern char ch000000[]; extern char ch000001[]; extern char ch000002[]; extern char ch000003[]; extern char ch000004[]; extern char ch000005[]; extern char ch000006[]; extern char ch000007[]; extern char ch000008[]; extern char ch000009[]; extern char ch000010[]; extern char ch000011[]; char *chiffrestab[12] = {ch000000, ch000001, ch000002, ch000003, ch000004, ch000005, ch000006, ch000007, ch000008,ch000009, ch000010, ch000011}; extern char SCBchiffres[]; // déclaration d'un nouveau controleur de sprite, coque #asm _SCBchiffres 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 // ------------------------------------ // ------------------------------------ char jauge[]; // // clip du sprite jauge d'énergie du shiplayer extern char ja000000[]; extern char ja001000[]; extern char ja002000[]; extern char ja003000[]; extern char ja004000[]; extern char ja005000[]; extern char ja006000[]; extern char ja007000[]; extern char ja008000[]; extern char ja009000[]; char *jaugetab[10] = {ja000000, ja001000, ja002000, ja003000, ja004000, ja005000, ja006000, ja007000, ja008000, ja009000}; extern char SCBjauge[]; // déclaration d'un nouveau controleur de sprite, coque #asm _SCBjauge 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 // ------------------------------------ // variable (int = 2 octets ; char = 1 octet) int posx,posy,level; // int i,score,energ,pchi,upchi; int compteur,scrollx; char goship,t,tempa,tempb,tempc,tempd,etape; // de -128 à 127 // assembler vertical retrace syncronisation routine void Vsync() { #asm vretrace: lda $fd0a bne vretrace #endasm } // Hors de l'assembleur, point de salut... // L'utilisation de la procedure suivante, lors de l'écran d'action, // fait ramer le jeu. void Fchiffres(clx,cly,classe) int clx; int cly; int classe; { SCBDATA(SCBchiffres) = chiffrestab[classe%12]; SCBX(SCBchiffres) = clx; SCBY(SCBchiffres) = cly; DrawSprite(SCBchiffres); } /************************************************************************** ** ** ** ** **************************************************************************/ 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 = -40; posy = 39; // coordonnées X et Y du shiplayer, coque : SCBX(SCBsprite2) = 58; SCBY(SCBsprite2) = 52; SCBDATA(SCBsprite2) = sprite2; // coordonnées X et Y des chiffres et des lettres : SCBX(SCBchiffres) = 0; SCBY(SCBchiffres) = 0; SCBDATA(SCBchiffres) = chiffres; // coordonnées X et Y de la jauge : SCBX(SCBjauge) = 0; SCBY(SCBjauge) = 0; SCBDATA(SCBjauge) = jauge; for(;;) // boucle principale { // ********************************************************************************************* if (etape==0) // écran titre { DrawSprite(SCB); // affichage fond1 Fchiffres(4,5,0); // 0 Fchiffres(4,10,10); //. Fchiffres(4,15,2); //2 if (joystick & BUTTON_OPTION1) { etape=1; energ=10; level=1; goship=0; posx=-40; posy=39; SCBDATA(SCB) = fondlvl; } } // ********************************************************************************************* if (etape==1) // écran level { for (compteur = 0 ; compteur < 5 ; compteur++) // de 0 à 4, ce qui fait 5. Grâce à la boucle for... { SCBX(SCB) = compteur*32; // ...on incrémente la position X de chaque nouvelle image... DrawSprite(SCB); // ... et ainsi on affiche fondlvl 5 fois la même image (taille: 32*102) l'une àprès l'autre, à un intervalle de 32. } // SCBDATA(SCBchiffres) = chiffrestab[11%12]; // L // SCBX(SCBchiffres) = 80; // SCBY(SCBchiffres) = 44; // DrawSprite(SCBchiffres); Fchiffres(80,44,11); // SCBDATA(SCBchiffres) = chiffrestab[10%12]; // - // SCBX(SCBchiffres) = 80; // SCBY(SCBchiffres) = 44+5; // DrawSprite(SCBchiffres); Fchiffres(80,49,10); // SCBDATA(SCBchiffres) = chiffrestab[level%12]; // 1 // SCBX(SCBchiffres) = 80; // SCBY(SCBchiffres) = 44+10; // DrawSprite(SCBchiffres); Fchiffres(80,54,level); ++tempa; // vitesse animation de l'hélice if (tempa>=79) {tempa=0; etape=2;SCBDATA(SCB) = fond2;} } // ********************************************************************************************* if (etape==2) // monde 1 : affichage de 6 images pour le décors, et les 2 images du shiplayer. { // ********* decor : ++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. } // ********* shiplayer : if (goship==0 & posx<20) { posx=posx+1; if (posx>=20) {posx=20; goship=1;} } if (goship==1) { 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; ++tempa; // vitesse animation de l'hélice if (tempa>=3) { tempa=0; ++t; } // clip du sprite 1 if (t>=5) t=0; SCBDATA(SCBsprite1) = sprtab[t%6]; // rappel: Le sprite 2 (coque) est lié au sprite 1 (hélice). SCBX(SCBsprite2) = posx+8; SCBY(SCBsprite2) = posy-1; DrawSprite(SCBsprite1); // ********* chiffre & lettre : ++tempc; // test le score if (tempc>=24) { tempc=0; if (score<100) ++score; if (score>99) score=0; } if (score<10) { //pchi=score; // unité: SCBDATA(SCBchiffres) = chiffrestab[score%12]; SCBX(SCBchiffres) = 150; SCBY(SCBchiffres) = 51; DrawSprite(SCBchiffres); // Fchiffres(150,51,score); // dizaine: SCBDATA(SCBchiffres) = chiffrestab[0%12]; // 0 SCBX(SCBchiffres) = 150; SCBY(SCBchiffres) = 51-4; DrawSprite(SCBchiffres); // Fchiffres(150,47,0); } if (score>9) { pchi=score; if (score>9 & score<20) {pchi=pchi-10;upchi=1;} if (score>19 & score<30) {pchi=pchi-20;upchi=2;} if (score>29 & score<40) {pchi=pchi-30;upchi=3;} if (score>39 & score<50) {pchi=pchi-40;upchi=4;} if (score>49 & score<60) {pchi=pchi-50;upchi=5;} if (score>59 & score<70) {pchi=pchi-60;upchi=6;} if (score>69 & score<80) {pchi=pchi-70;upchi=7;} if (score>79 & score<90) {pchi=pchi-80;upchi=8;} if (score>89 & score<100) {pchi=pchi-90;upchi=9;} // unité: SCBDATA(SCBchiffres) = chiffrestab[pchi%12]; SCBX(SCBchiffres) = 150; SCBY(SCBchiffres) = 51; DrawSprite(SCBchiffres); // Fchiffres(150,51,pchi); // dizaine: SCBDATA(SCBchiffres) = chiffrestab[upchi%12]; SCBX(SCBchiffres) = 150; SCBY(SCBchiffres) = 51-4; DrawSprite(SCBchiffres); // Fchiffres(150,47,upchi); } // ********* jauge : ++tempd; // test la jauge if (tempd>=19) { tempd=0; --energ; if (energ<1) energ=10; } //energ=1; --energ; // energ de 1 à 10 --> mais de 0 à 9 pour le n° image SCBDATA(SCBjauge) = jaugetab[energ%10]; SCBX(SCBjauge) = 55; SCBY(SCBjauge) = 4; DrawSprite(SCBjauge); ++energ; } // ********************************************************************************************* Vsync(); SwapBuffers(); } } //}

Pour la suite des aventures du petit nanoship, j'ai besoin de connaitre la méthode pour sortir un nombre au hasard entre 1 et 102.
avatar
Travaux, concept of proof, divers :
Megadrive
topics/172-143753-moved-juju-densetsu
Lynx
sections/255-developpeurs-lynx

15

n = random()%102;

Par contre, tu verras vite que le random n'est est pas vraiment un (il va te sortir toujours la même suite).
Ce que je fais généralement, c'est que dans la boucle principale du menu, en attendant l'appui sur un bouton, je met un random(), comme il est quasi improbable que le joueur lance le jeu 2 fois pile au même moment, ça fait du pseudo aléatoire
Sinon, il existe des algos qui trainent sur le net...
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2022 ?
https://yastuna-games.com

16

Je viens juste de découvrir ce topic et un seul mot me viens BRAVO !
Super boulot Beauregard ! Ça fait plaisir de voir de nouvelles personnes motivées s'intéresser à la Lynx qui plus est avec le niveau que tu as !
Ta petite démo est impressionnante et le partage du code source c'est vraiment la grande classe top
J'attends la suite avec une impatience non dissimulée love

Mon site sur la LYNX :ZoneLynx

17

RYGAR (./16) :
Je viens juste de découvrir ce topic et un seul mot me viens BRAVO !
merci smile calin

La version 0.3 du jeu est arrivé les amis ! smile Premiers éléments interactifs, changement d'une couleur dans la palette, et une véritable lutte pour parvenir à faire une créature et un rocher en mouvement pas trop moche (pas facile avec si peu de pixels et de couleurs), sans que le tout ne se mette à ralentir (l'utilisation de la procédure, fait il y a peu à l'aide de Vince et Fadest, est à proscrire pendant les phases d'actions du jeu).

[URL=http://img100.imageshack.us/i/fofo2.jpg/][IMG]http://img100.imageshack.us/img100/8668/fofo2.th.jpg[/IMG][/URL]
char redir[]={0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF}; char pal[]={ 0x00,0x03,0x04,0x04,0x06,0x0B,0x09,0x0C,0x0D,0x0D,0x0D,0x04,0x05,0x02,0x08,0x05, 0x00,0x33,0x44,0x44,0x66,0xBB,0x28,0x2B,0x2C,0x2D,0x6D,0x58,0x5A,0x4C,0x88,0x64};



exe version 0.3 (à tester sur votre émulateur préféré):
tromb Fichier joint : globshoot_03.o

tromb Fichier joint : rhum.bmp
tromb Fichier joint : roch.bmp
tromb Fichier joint : gameover.bmp


/* Glob Shoot version 0.3 - LYNX 31/10/2010 console tenu à la verticale Handy/Option/Rotate Screen(Right) D-pad et bouton option 1 LYNX-image */ #include <lynx.h> #include <lynxlib.h> #include <stdlib.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 fondlvl[]; // image fond level, d'une taille de 32*102; extern char gameover[]; // image game over, d'une taille de 20*32; 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 extern char fond2[]; // image decor monde 1, d'une taille de 32*102; il faudra donc scroller 6 images de droite à gauche. char SCBfond2[]; // à la 3ème ligna asm, j'ai remplacé 100 par 200 pour doubler la largeur du décor (nbre de colonne * 2) #asm _SCBfond2 dc.b $c0,$10,$20 dc.w 0,0 dc.w 0,0,$200,$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 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}; char SCBsprite1[]; // déclaration d'un nouveau controleur de sprite, moteur à hélice 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 // ------------------------------------ char chiffres[]; // // clip du sprite chiffres: 0123456789.L extern char ch000000[]; extern char ch000001[]; extern char ch000002[]; extern char ch000003[]; extern char ch000004[]; extern char ch000005[]; extern char ch000006[]; extern char ch000007[]; extern char ch000008[]; extern char ch000009[]; extern char ch000010[]; extern char ch000011[]; char *chiffrestab[12] = {ch000000, ch000001, ch000002, ch000003, ch000004, ch000005, ch000006, ch000007, ch000008,ch000009, ch000010, ch000011}; extern char SCBchiffres[]; // déclaration d'un nouveau controleur de sprite #asm _SCBchiffres 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 // ------------------------------------ // ------------------------------------ char jauge[]; // // clip du sprite jauge d'énergie du shiplayer extern char ja000000[]; extern char ja001000[]; extern char ja002000[]; extern char ja003000[]; extern char ja004000[]; extern char ja005000[]; extern char ja006000[]; extern char ja007000[]; extern char ja008000[]; extern char ja009000[]; char *jaugetab[10] = {ja000000, ja001000, ja002000, ja003000, ja004000, ja005000, ja006000, ja007000, ja008000, ja009000}; extern char SCBjauge[]; // déclaration d'un nouveau controleur de sprite #asm _SCBjauge 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 // ------------------------------------ // ------------------------------------ char rhume[]; // // clip du sprite rhume, que le nanoship doit capturer. extern char rh000000[]; extern char rh000001[]; extern char rh000002[]; extern char rh000003[]; extern char rh000004[]; extern char rh000005[]; extern char rh000006[]; char *rhumetab[7] = {rh000000, rh000001, rh000002, rh000003, rh000004, rh000005, rh000006}; extern char SCBrhume[]; // déclaration d'un nouveau controleur de sprite #asm _SCBrhume 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 // ------------------------------------ c0 à la plce de c7 desactive la couleur 0 (transparente) // ------------------------------------ char roch[]; // // clip du sprite rhume, que le nanoship doit capturer. extern char ro000000[]; extern char ro000001[]; extern char ro000002[]; extern char ro000003[]; extern char ro000004[]; extern char ro000005[]; extern char ro000006[]; extern char ro000007[]; extern char ro000008[]; extern char ro000009[]; extern char ro000010[]; extern char ro000011[]; extern char ro000012[]; extern char ro000013[]; extern char ro000014[]; extern char ro000015[]; extern char ro000016[]; extern char ro000017[]; char *rochtab[18] = {ro000000, ro000001, ro000002, ro000003, ro000004, ro000005, ro000006, ro000007, ro000008, ro000009, ro000010, ro000011, ro000012, ro000013, ro000014, ro000015, ro000016, ro000017}; extern char SCBroch[]; // déclaration d'un nouveau controleur de sprite #asm _SCBroch 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 // ------------------------------------ // variable (int = 2 octets ; char = 1 octet) int posx,posy,level; // int i,score,energ,pchi,upchi; int compteur,scrollx; char goship,t,tempa,tempb,tempc,tempd,tempe,etape,gslife,stopm,pause,drap1,nodecor,boumgb,aaroch; // de -128 à 127 int govil,vil,vilx,tempvilx,vily,avil,tempavil,hasa,hasam,hasar; int goroch,eroch,rochx,temprochx,rochy,aroch,temparoch,rasa,rasam,rasar; int atest; // assembler vertical retrace syncronisation routine void Vsync() { #asm vretrace: lda $fd0a bne vretrace #endasm } // Hors de l'assembleur, point de salut... // L'utilisation de la procedure suivante, lors de l'écran d'action, // fait ramer le jeu. void Fchiffres(clx,cly,classe) int clx; int cly; int classe; { SCBDATA(SCBchiffres) = chiffrestab[classe%12]; SCBX(SCBchiffres) = clx; SCBY(SCBchiffres) = cly; DrawSprite(SCBchiffres); } /************************************************************************** ** ** ** ** **************************************************************************/ 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 = -40; posy = 39; // coordonnées X et Y du shiplayer, coque : SCBX(SCBsprite2) = 58; SCBY(SCBsprite2) = 52; SCBDATA(SCBsprite2) = sprite2; // coordonnées X et Y des chiffres et des lettres : SCBX(SCBchiffres) = 0; SCBY(SCBchiffres) = 0; SCBDATA(SCBchiffres) = chiffres; // coordonnées X et Y de la jauge : SCBX(SCBjauge) = 0; SCBY(SCBjauge) = 0; SCBDATA(SCBjauge) = jauge; /************************************************************************** ** BOUCLE PRINCIPALE ** **************************************************************************/ for(;;) // boucle principale { // test affichage nombre de sprite: if (joystick & (BUTTON_RIGHT)) nodecor=1;//{nodecor=1;DrawFBox(0,0,160,102,0);} if (joystick & (BUTTON_LEFT)) nodecor=0; // ********************************************************************************************* if (etape==0) // écran titre { DrawSprite(SCB); // affichage fond1 Fchiffres(4,5,0); // 0 Fchiffres(4,10,10); //. Fchiffres(4,15,3); //3 ++tempa; if (tempa>24 & etape==0) // petite teporisation avant d'autoriser le joueur de recommencer le jeu. { tempa=24; if (joystick & (BUTTON_OPTION1)) { tempa=0;etape=1; energ=10; level=1;score=0;drap1=0; // drap1 agit sur l'affichage du score. goship=0; posx=-40; posy=39;gslife=3; govil=0;goroch=0; SCBDATA(SCB) = fondlvl; } } } // ********************************************************************************************* if (etape==1 | etape==8 | etape==9) // écran level OU ecran perd une vie/game over { SCBDATA(SCB) = fondlvl; for (compteur = 0 ; compteur < 5 ; compteur++) // de 0 à 4, ce qui fait 5. Grâce à la boucle for... { SCBX(SCB) = compteur*32; // ...on incrémente la position X de chaque nouvelle image... SCBY(SCB) =0; DrawSprite(SCB); // ... et ainsi on affiche fondlvl 5 fois la même image (taille: 32*102) l'une àprès l'autre, à un intervalle de 32. } } // ********************************************************************************************* if (etape==1) { // SCBDATA(SCBchiffres) = chiffrestab[11%12]; // L // SCBX(SCBchiffres) = 93; // SCBY(SCBchiffres) = 44; // DrawSprite(SCBchiffres); Fchiffres(93,44,11); // SCBDATA(SCBchiffres) = chiffrestab[10%12]; // - // SCBX(SCBchiffres) = 93; // SCBY(SCBchiffres) = 44+5; // DrawSprite(SCBchiffres); Fchiffres(93,49,10); // SCBDATA(SCBchiffres) = chiffrestab[level%12]; // 1 // SCBX(SCBchiffres) = 93; // SCBY(SCBchiffres) = 44+10; // DrawSprite(SCBchiffres); Fchiffres(93,57,level); Fchiffres(61,57,gslife); // nbre de vie SCBDATA(SCBrhume) = rhumetab[5%7]; // coeur SCBX(SCBrhume) = 57; SCBY(SCBrhume) = 39; DrawSprite(SCBrhume); ++tempa; // durée de l'écran de présentation : level et nbre de life if (tempa>=79) { tempa=0; etape=2; SCBDATA(SCB) = fond2; drap1=1; govil=0;goroch=0; boumgb=0; } } // ********************************************************************************************* // Affichage de 4 images pour le décors, les 2 images du shiplayer, la jauge et les 2 images du score. if (etape==2) { // ********* decor : // ++tempb; // vitesse defilement du decor // if (tempb>=2) // { // tempb=0; //scrollx++; scrollx=scrollx+2; // } // 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; // SCBY(SCB) = 0; // 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 (nodecor==0) DrawSprite(SCB); // } /*************************************************************************** ** Problème de ralentissement au bout de 20 secondes de jeu : j'ai décidé ** ** d'économiser deux (gros) sprites utilisés pour le décor. ** ***************************************************************************/ if (scrollx==64) scrollx=0; // l'image fond2 : 32 pixels de large, donc remise à 0 si égale à 32. for (compteur = 0 ; compteur < 4 ; compteur++) // de 0 à 3, ce qui fait 4. Grâce à la boucle for... { SCBX(SCBfond2) = compteur*64; // ...on incrémente la position X de chaque nouvelle image... SCBX(SCBfond2)=SCBX(SCBfond2)-scrollx; SCBY(SCBfond2) = 0; SCBDATA(SCBfond2) = fond2; DrawSprite(SCBfond2); // ... et ainsi on affiche 4 fois la même image (taille: 64*102) l'une àprès l'autre, à un intervalle de 64. //if (nodecor==0) DrawSprite(SCB); } // ********* shiplayer : if (goship==0 & posx<20) { posx=posx+1; if (posx>=20) {posx=20; goship=1;} } if (goship==1 & stopm==0) { 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>80) posy=80; } // sprite 1 du shiplayer: moteur à hélice (6 images d'une taille de 8*22 chacunes) SCBX(SCBsprite1) = posx; SCBY(SCBsprite1) = posy; ++tempa; // vitesse animation de l'hélice if (tempa>=3+stopm) { tempa=0; ++t; if (stopm>0 & stopm<32) ++stopm; // Arrêt progressif du moteur à hélice... } if (stopm>1) // ...et le shiplayer sort progressivement de l'écran. { ++tempe; if (tempe>=4) {tempe=0; posx--;} } // clip du sprite 1 if (t>=5) t=0; SCBDATA(SCBsprite1) = sprtab[t%6]; // rappel: Le sprite 2 (coque) est lié au sprite 1 (hélice). SCBX(SCBsprite2) = posx+8; SCBY(SCBsprite2) = posy-1; DrawSprite(SCBsprite1); // ********* rocher 1 : if (eroch==0) { if (goroch<9) ++goroch; // petite temporisation avant l'attaque virale if (goship==1 & goroch>8 & stopm==0) { rasam=rasa; rasa=random()%4; // de 0 à 3 if (rasa==rasam) // Si le même nombre sort 2 fois de suite, alors... { rasar=random()%2; // de 0 à 1 if (rasar==0) ++rasa; if (rasar==1) --rasa; } if (rasa>3) rasa=0; if (rasa<0) rasa=3; eroch=1;rochx=160;temprochx=0;rochy=rasa*24;rochy=rochy+3;aroch=0;temparoch=0; // Taille rocher1: 24*24 ; objectif : // 4 positions de départ Y pour le rocher : rochy = 3 ou 27 ou 51 ou 75 // espacement de 3 lignes en haut et en bas : 3 et 99 (75 + 24 (nbre de ligne du rocher1)) } } if (eroch==1) { //++temprochx; // vitesse du rocher 1 en fonction du niveau. if (level==1)// & temprochx>1) { //temprochx=0;--rochx; rochx=rochx-1; } if (level==2)// & temprochx>0) { //temprochx=0;--rochx; rochx=rochx-2; } ++temparoch; // animation du rocher 1 if (temparoch>5) { temparoch=0;++aroch; if (aroch>15) aroch=0; } if (rochx<-24) {eroch=0;} // si rocher1 sort de l'écran, alors remise à 0 de sa création. // collision rocher1/shiplayer !!! if (stopm==0) { if (rochy+12>posy-4 & rochy+12<posy+28) { if (rochx+12>posx & rochx+12<posx+40) { eroch=0;aaroch=16; boumgb=1; stopm=1;energ=0; // panne sèche: arrêt du moteur à hélice } } } } if (eroch>0) // affichage { SCBDATA(SCBroch) = rochtab[aroch%18]; SCBX(SCBroch) = rochx; SCBY(SCBroch) = rochy; DrawSprite(SCBroch); } // test3: //SCBDATA(SCBchiffres) = chiffrestab[10%12]; //SCBX(SCBchiffres) = rochx+12; //SCBY(SCBchiffres) = rochy+12; //DrawSprite(SCBchiffres); // fin test3 // ********* rhume (vilain 1) : if (govil<32) ++govil; // petite temporisation avant l'attaque virale if (goship==1 & govil>31 & vil==0 & stopm==0) { hasam=hasa; hasa=random()%6; // de 0 à 5 // if (hasa==hasam) ++hasa; // if (hasa>5) hasa=0; if (hasa==hasam) // Si le même nombre sort 2 fois de suite, alors... { hasar=random()%2; // de 0 à 1 if (hasar==0) ++hasa; if (hasar==1) --hasa; } if (hasa>5) hasa=0; if (hasa<0) hasa=5; vil=1;vilx=160;tempvilx=0;vily=hasa*16;vily=vily+3;avil=0;tempavil=0; // Taille vilain1: 16*16 ; objectif : // 6 positions de départ Y pour le vilain1 : vily = 3 ou 19 ou 35 ou 51 ou 67 ou 83 // espacement de 3 lignes en haut et en bas : 3 et 99 (83 + 16 (nbre de ligne du vilain1)) } // // test1: // SCBDATA(SCBchiffres) = chiffrestab[10%12]; // SCBX(SCBchiffres) = posx+30; // SCBY(SCBchiffres) = posy+9; // DrawSprite(SCBchiffres); // SCBX(SCBchiffres) = posx+30; // SCBY(SCBchiffres) = posy+12; // DrawSprite(SCBchiffres); // SCBX(SCBchiffres) = posx+40; // SCBY(SCBchiffres) = posy+9; // DrawSprite(SCBchiffres); // SCBX(SCBchiffres) = posx+40; // SCBY(SCBchiffres) = posy+12; // DrawSprite(SCBchiffres); // fin test1 if (vil==1) { ++tempvilx; // vitesse du vilain 1 en fonction du niveau. if (level==1 & tempvilx>1) { tempvilx=0;--vilx; } if (level==2 & tempvilx>0) { tempvilx=0;--vilx; } ++tempavil; // animation du vilain 1 /*************************************************************************** ** Les conditions suivantes ralentissent le jeu ! Alors j'opte pour une ** ** seule condition... il faut limiter le nbre de condition. ***************************************************************************/ // if (tempavil==41) tempavil=1; // if (tempavil>0 & tempavil<11) avil=0; // 1 à 10 // if (tempavil>10 & tempavil<21) avil=1; // 11 à 20 // if (tempavil>20 & tempavil<31) avil=2; // 21 à 30 // if (tempavil>30 & tempavil<41) avil=1; // 31 à 40 if (tempavil>10) { tempavil=0;++avil; if (avil>2) avil=0; } // SCBDATA(SCBrhume) = rhumetab[avil%7]; // SCBX(SCBrhume) = vilx; // SCBY(SCBrhume) = vily; // DrawSprite(SCBrhume); if (vilx<-16) {vil=0;} // si vilain1 sort de l'écran, alors remise à 0 de sa création. // test2: // SCBX(SCBchiffres) = vilx; // SCBY(SCBchiffres) = vily+8; // DrawSprite(SCBchiffres); // fin test2 // capture du vilain1 !!! // atest=0; // if (vily+8>posy+9 & vily+8<posy+12) atest=1; // if (vily+6>posy+7 & vily+8<posy+16) atest=1; if (stopm==0) { if (vily+8>posy+7 & vily+8<posy+16) { if (vilx>posx+30 & vilx<posx+40) { // atest=1; vil=2;avil=3;tempavil=0; } } } // vily // posx // posy } if (vil==2) // virus capturé le nanoship ! { // avil=3; vily=posy+3;vilx=posx+38; tempd=0; // ici, on stoppe temporairement la jauge. ++tempavil; // animation du vilain 1 if (tempavil>0 & tempavil<11) avil=4; // 1 à 10 if (tempavil>10 & tempavil<21) avil=3; // 11 à 20 if (tempavil>20 & tempavil<31) avil=4; // 21 à 30 if (tempavil==31) { vil=0;energ=energ+4;++score; if (energ>10) energ=10; // --energ; // if (energ<1) energ=10; } } if (vil>0) // affichage { SCBDATA(SCBrhume) = rhumetab[avil%7]; SCBX(SCBrhume) = vilx; SCBY(SCBrhume) = vily; DrawSprite(SCBrhume); } // ********* chiffre & lettre : // ++tempc; // test le score // if (tempc>=24) // { // tempc=0; // if (score<100) ++score; // if (score>99) score=0; // // hasam=hasa; // hasa=random()%7; // de 0 à 6 // if (hasa==hasam) ++hasa; // if (hasa==7) hasa=0; // score=hasa; // } // ********* jauge d'énergie du shiplayer: ++tempd; // test la jauge if (tempd>=59 & energ>0) { tempd=0;--energ; if (energ==0) { stopm=1; // panne sèche: arrêt du moteur à hélice } } //energ=1; if (energ>0) { --energ; // energ de 1 à 10 --> mais de 0 à 9 pour le n° image SCBDATA(SCBjauge) = jaugetab[energ%10]; SCBX(SCBjauge) = 55; SCBY(SCBjauge) = 4; DrawSprite(SCBjauge); ++energ; } if (stopm>0) { if (boumgb>0) // explosion du shiplayer { ++aaroch; if (aaroch==18) aaroch=16; SCBDATA(SCBroch) = rochtab[aaroch%18]; SCBX(SCBroch) = posx+10; SCBY(SCBroch) = posy-1; DrawSprite(SCBroch); } if (posx<-32) { --gslife; // perd un ship... stopm=0;etape=1;tempa=0;energ=10;goship=0;posx=-40;posy=39;boumgb=0;aaroch=0; govil=0;vil=0;vilx=0;tempvilx=0;vily=0;avil=0;tempavil=0; hasa=0;hasam=0;hasar=0; goroch=0;eroch=0;rochx=0;temprochx=0;rochy=0;aroch=0;temparoch=0; rasa=0;rasam=0;rasar=0; if (gslife>0) // ...mais s'il en reste encore, alors retour à l'étape 1. { etape=1; } if (gslife<1) // ...mais s'il n'en plus, alors game over. { etape=8; } } } } // ********************************************************************************************* // if (etape==3) // { // } // ********************************************************************************************* if (etape>7) { SCBDATA(SCB) = gameover; SCBX(SCB) = 70; SCBY(SCB) = 34; DrawSprite(SCB); if (etape==9) { if (!(joystick & BUTTON_OPTION1)) { etape=0;SCBX(SCB)=0;SCBY(SCB)=0;SCBDATA(SCB)=fond1; } } if (etape==8) { ++tempa; if (tempa>24) // petite teporisation avant d'autoriser le joueur de recommencer le jeu. { tempa=24; if (joystick & BUTTON_OPTION1) {tempa=0;etape=9;} } } } // ********************************************************************************************* if ((etape==1 & drap1==1) | etape==2 | etape==8 | etape==9) // affichage du score { if (score<10) { //pchi=score; // unité: SCBDATA(SCBchiffres) = chiffrestab[score%12]; SCBX(SCBchiffres) = 150; SCBY(SCBchiffres) = 51; DrawSprite(SCBchiffres); // Fchiffres(150,51,score); // dizaine: SCBDATA(SCBchiffres) = chiffrestab[0%12]; // 0 SCBX(SCBchiffres) = 150; SCBY(SCBchiffres) = 51-4; DrawSprite(SCBchiffres); // Fchiffres(150,47,0); } if (score>9) { pchi=score; if (score>9 & score<20) {pchi=pchi-10;upchi=1;} if (score>19 & score<30) {pchi=pchi-20;upchi=2;} if (score>29 & score<40) {pchi=pchi-30;upchi=3;} if (score>39 & score<50) {pchi=pchi-40;upchi=4;} if (score>49 & score<60) {pchi=pchi-50;upchi=5;} if (score>59 & score<70) {pchi=pchi-60;upchi=6;} if (score>69 & score<80) {pchi=pchi-70;upchi=7;} if (score>79 & score<90) {pchi=pchi-80;upchi=8;} if (score>89 & score<100) {pchi=pchi-90;upchi=9;} // unité: SCBDATA(SCBchiffres) = chiffrestab[pchi%12]; SCBX(SCBchiffres) = 150; SCBY(SCBchiffres) = 51; DrawSprite(SCBchiffres); // Fchiffres(150,51,pchi); // dizaine: SCBDATA(SCBchiffres) = chiffrestab[upchi%12]; SCBX(SCBchiffres) = 150; SCBY(SCBchiffres) = 51-4; DrawSprite(SCBchiffres); // Fchiffres(150,47,upchi); } } // ********************************************************************************************* //Fchiffres(8,92,etape); // test de variable (mais où est le debogueur ?) Vsync(); SwapBuffers(); } /************************************************************************** ** FIN de la BOUCLE PRINCIPALE ** **************************************************************************/ } //}

Face à des problèmes de ralentissement (au bout de 10 ou 20 secondes), j'ai décidé d'utiliser moins de sprites pour le décor (4 au lieu de 6). Mais je ne connais pas bien les limites de la console. Il faut tester sur une LYNX, et me dire ce qu'il en est.

avatar
Travaux, concept of proof, divers :
Megadrive
topics/172-143753-moved-juju-densetsu
Lynx
sections/255-developpeurs-lynx

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...
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2022 ?
https://yastuna-games.com

19

D'ailleurs, vu ton code actuel, tu devrais faire en sorte d'utiliser un nombre de sprite qui soit un nombre premier et calculer l'utilisation de la mémoire pour que la zone réservée aux sprites soit un entier naturel multiple de 23...
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

20

Comme te le dis Fadest il va rapidement falloir que tu commences à chainer tes sprites car passé une dizaine les ralentissements vont rendre les jeux injouable.
D'après la doc technique de la machine, la Lynx n'a aucune limite concernant le nombre de sprites affichables simultanément à l'écran. J'ai fait des essais avec des sprites de 6X6 qui se déplaçaient de gauche à droite et je suis monté sans problème à plus de 50 mais bien sur ils étaient chainés.

J'ai testé ta démo sur une vrai lynx et aucun ralentissement n'est à signaler, cela fonctionne aussi bien que sous émulateur. Le seul problème viens peut être des couleurs que tu utilises qui sont beaucoup trop ternes sur l'écran de la machine. Mise à part ça bon boulot et vivement que l'on puisse fait exploser ses rochers avec de beaux tirs de laser. top
Mon site sur la LYNX :ZoneLynx

21

Je vais voir tout ça, merci. Je précise que le jeu ne gèrera pas beaucoup plus de sprite, car ce n'est pas un shump.
RYGAR (./20) :
J'ai testé ta démo sur une vrai lynx et aucun ralentissement n'est à signaler, cela fonctionne aussi bien que sous émulateur. Le seul problème viens peut être des couleurs que tu utilises qui sont beaucoup trop ternes sur l'écran de la machine. Mise à part ça bon boulot et vivement que l'on puisse fait exploser ses rochers avec de beaux tirs de laser. top
merci pour le test top je vais essayer de corriger la mise en couleur.

le principe du jeu est simple : éviter les rochers, et capturer les petites créatures qui vont servir de carburant pour le vaisseau. Faut dire que ça se passe dans le corps humain, le vaisseau est un nanoship (vaisseau miniaturisé ressemblant à un sous marin futuriste) dont la mission est de capturer les virus. Une fois capturé par le nanoship, le virus est transformé en carburant.

La jauge de carburant est visible à gauche de l'écran, et son niveau descend inexorablement. Capturer les virus est donc indispensable pour remonter le niveau de cette jauge, sinon, gare à la panne sèche !


avatar
Travaux, concept of proof, divers :
Megadrive
topics/172-143753-moved-juju-densetsu
Lynx
sections/255-developpeurs-lynx

22

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 ?
avatar
Travaux, concept of proof, divers :
Megadrive
topics/172-143753-moved-juju-densetsu
Lynx
sections/255-developpeurs-lynx

23

pour ta dernière question, l'instruction de ton code :
SetBuffers(SCREEN, RENDER ,0);
définit respectivement le buffer physique, le buffer logique et le buffer de collision.
Si la valeur est 0, alors le buffer n'est pas définit.
Donc, tu n'as pas déclaré de buffer de collision, donc tu ne perds pas 8 ko de RAM...

Il est bien sur possible de ne pas définir également de buffer logique, auquel cas, chaque affichage se fait directement à l'écran et pas dans le buffer logique, ce qui gagne 8 ko supplémentaires, mais dès qu'il y a des animations, ça clignote horriblement (à réserver pour des jeux à écrans fixes)
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2022 ?
https://yastuna-games.com

24

Fadest (./23) :
Donc, tu n'as pas déclaré de buffer de collision, donc tu ne perds pas 8 ko de RAM...
C'est bon à savoir, merci pour l'info. smile
RYGAR (./20) :
Le seul problème viens peut être des couleurs que tu utilises qui sont beaucoup trop ternes sur l'écran de la machine.
J'ai revu la mise en couleur du jeu, j'ai troqué les nuances de gris pour du vert. Nanoship, virus (à capturer) et calcul renaux (à éviter) bénéficient de couleurs plus vive que le décor. J'espère que cette fois-ci, la lisibilité sera meilleure.

[URL=http://img826.imageshack.us/i/fofogs031.jpg/][IMG]http://img826.imageshack.us/img826/7430/fofogs031.th.jpg[/IMG][/URL]

exe version 0.31 (à tester sur votre LYNX 1 et 2):



tromb Fichier joint : globshoot_031.o
avatar
Travaux, concept of proof, divers :
Megadrive
topics/172-143753-moved-juju-densetsu
Lynx
sections/255-developpeurs-lynx

25

J'ai compris comment chainés les sprites grin
Maintenant, je me demande si ma méthode, pour cloner romeo, ne pourrai être amélioré ? loupe

exe : tromb Fichier joint : romeo02.o
/* Clonage/liste chainée version 0.2 - LYNX 04/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 char SCBromeo2[]; // déclaration d'un nouveau controleur de sprite char SCBromeo3[]; // déclaration d'un nouveau controleur de sprite #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 ; _SCBromeo2 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 ; _SCBromeo3 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; SCBNEXT(SCB) = SCBromeo; // chainage de sprite SCBX(SCBromeo) = 0; SCBY(SCBromeo) = 0; SCBDATA(SCBromeo) = romeotab[0%6]; SCBNEXT(SCBromeo) = SCBromeo2; // chainage de sprite SCBX(SCBromeo2) = 52; SCBY(SCBromeo2) = 26; SCBDATA(SCBromeo2) = romeotab[0%6]; SCBNEXT(SCBromeo2) = SCBromeo3; // chainage de sprite SCBX(SCBromeo3) = 104; SCBY(SCBromeo3) = 52; SCBDATA(SCBromeo3) = romeotab[0%6]; /************************************************************************** ** BOUCLE PRINCIPALE ** **************************************************************************/ for( ; ; ) { // position X et Y du grand sprite pour le fond : SCBX(SCB) = posx; SCBY(SCB) = posy; 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 de romeo if (drap1==0) { ++tempa; // animation de romeo if (tempa>40) {drap1=1;tempa=0;} } if (drap1==1) { ++tempa; // animation de romeo if (tempa>10) { tempa=0;++aromeo; if (aromeo>5) {aromeo=0;drap1=0;} } } // romeo 1 : SCBX(SCBromeo) = 0; SCBY(SCBromeo) = 0; SCBDATA(SCBromeo) = romeotab[aromeo%6]; // romeo 2 : SCBX(SCBromeo2) = 52; SCBY(SCBromeo2) = 26; SCBDATA(SCBromeo2) = romeotab[aromeo%6]; // romeo 3 : SCBX(SCBromeo3) = 104; SCBY(SCBromeo3) = 52; SCBDATA(SCBromeo3) = romeotab[aromeo%6]; // Affichage des sprites chainé: DrawSprite(SCB); Vsync(); SwapBuffers(); } /************************************************************************** ** FIN de la BOUCLE PRINCIPALE ** **************************************************************************/ }
avatar
Travaux, concept of proof, divers :
Megadrive
topics/172-143753-moved-juju-densetsu
Lynx
sections/255-developpeurs-lynx

26

J'ai testé la dernière version et les couleurs sont nettement plus sympa comme ça si ce n'est les rochers qui sont encore à mon gout trop semblables au décor de fond ce qui fait que parfois on se laisse surprendre à ne les voir qu'au dernier moment. J'ai pas regarder si tu utilisais déjà les 16 couleurs possibles mais si c'est le cas peut être juste détourer un peu de jaune ou de blanc les cailloux pourrait amélioré leur visibilité.

Et juste une petite remarque du joueur que je suis, sur lynx l'habitude veux que ce soit le bouton A qui lance le jeu et pas OPTION I.

Edit : En voulant faire une partie un peu plus longue je me suis redu compte de plusieurs chose, d'abords le jeu ne gère pas la "pause" (mais c'est peut être voulu) ensuite la vitesses des globules et des cailloux est toujours la même que l'on est un score de 10, 100 ou 700points alors qu'il serait bien qu'elle augmente histoire de rendre la partie plus intense (mais c'est peut être déjà prévu pour la prochaine version) et enfin les couleurs sont encore vraiment trop sombres et au bout de deux minutes il faut vraiment tirer les yeux pour arriver à discerner les rochers.

Je critique je critique mais il n'empêche que c'est un petit jeu bien sympa que je m'empresserais de graver quand tu l'auras fini

Et puis ton code et la simplicité du game play m'a redonné envie d'essayer de programmer de petites choses pour la Lynx alors là aussi chapeau top
Mon site sur la LYNX :ZoneLynx

27

Merci Rygar, ton témoignage est précieux, je vais revoir ce rocher. Pour la mise en place des niveaux, c'est dans mon esprit mais pas encore concrétisé. Je vais essayer de faire ça pour ce week end. smile
avatar
Travaux, concept of proof, divers :
Megadrive
topics/172-143753-moved-juju-densetsu
Lynx
sections/255-developpeurs-lynx

28

RYGAR (./26) :
d'abords le jeu ne gère pas la "pause" (mais c'est peut être voulu)

J'ai pris le temps de le faire aujourd'hui, mais il y a un truc qui me chiffonne.#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

Vous avez remarqué que #define BUTTON_OUTER et #define BUTTON_PAUSE avaient la même valeur ? Soit 0x01
avatar
Travaux, concept of proof, divers :
Megadrive
topics/172-143753-moved-juju-densetsu
Lynx
sections/255-developpeurs-lynx

29

C'est tout à fait normal.

C'est pour indiquer qu'il faut tester le premier bit (0x01 c'est 2 à la puissance 0)

Or Button_outer concerne le registre JOYSTICK en 0xFCB0 alors que le bouton pause s'appuie sur le registre SWITCHES en 0xFCB1
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

30

ah, merci de m'éclairer. smile
Au début du code, j'ai rajouté: #define SWITCHES 0x01

Mais quand je fais fait la modif dans le code, ça va pas : ) if (SWITCHES & BUTTON_PAUSE
avatar
Travaux, concept of proof, divers :
Megadrive
topics/172-143753-moved-juju-densetsu
Lynx
sections/255-developpeurs-lynx