210

Bonne idée Fadest, je vais me pencher sur ton programme aventure pour essayer de palier à ce pb.

Une conversation sur un topic avait dévié sur la création d'un tamagochi pour Lynx et je voulais voir si c'était possible de faire qqchose avec cette idée.

Mon but premier aurais été de raconter la petite histoire de l’œuf qui allait bientôt éclore avec une dizaine d'écrans de texte qui ce seraient succédé.

Comme le textout est limité J'ai aussi essayé de faire mon histoire sous forme d'un gros sprite de 160*999 pixel qui défile mais là ça me bouffe déjà 30ko sur le 38/40 disponible sad

Ce qui me fais halluciner en voyant les contraintes c'est quand je repense au générique de Lemmings, un générique qui dure presque 5 min et qui doit comporter pas moins de 1000 lignes de texte !
Mon site sur la LYNX :ZoneLynx

211

Ce n'est pas textout qui est limité, c'est l'espace réservé aux chaines de caractère en dur dans le code...

Pour Lemmings, ils n'ont pas les mêmes outils de développement/compilation, mais de toutes manières, le texte doit être stocké compressé (contrairement à ce que je fais pour Merlain, pour des raison de pratic... euh fainéantise) sur la ROM et décompressé avant affichage.
avatar
Futur ex éditeur de jeux Atari Lynx et Nintendo Game Boy
https://yastuna-games.com

212

Vince est le plus fort

(voilà, ça, c'est dit ^^)

Alors, parce que je suis super cool grin

Un petit programme pour afficher du texte depuis la ROM.

LOREM.C#include <lynx.h> #include <lynxlib.h> char SCREEN[8160] at (MEMTOP-16320); char RENDER[8160] at (MEMTOP-8160); char drawPending;//FileEntry est la "structure" utilisée pour l'accès aux fichiers dans la cartoucheextern char FileEntry[8]; //Texte est le tableau qui contiendra nos fichiers depuis la cartouchechar texte[1024];VBL() interrupt { if (drawPending) { SwapBuffers(); drawPending = 0; } } char pal[] = {0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,0x00,0x08,0x0F,0x08,0x00,0x0F,0x00,0x00,0x00, //0G0x00,0x0F,0x4F,0x0F,0x00,0xF0,0xF8,0x00,0x88,0x8F,0xFF,0xFF,0xFF,0x80,0x00,0x00 //BR};void Vsync() { #asm vretrace: lda $fd0a bne vretrace #endasm } char WaitButton(){ char key; while ( (key = joystick) == 0); while ( joystick ); return key;}char main(){ InitIRQ(); CLI; SetBuffers(SCREEN, RENDER ,0); InstallIRQ(2,VBL); EnableIRQ(2); SetRGB(pal); //On charge le fichier numéro 2 depuis la cartouche (le numéro 0, c'est insert.o et le numéro 1, c'est votre programme) LoadCartDir(2); //On charge un bloc de 1024 octets (pourquoi 1024 ? cf la doc technique, les blocs en rom font 1024 octets) LoadCartBlock(FileEntry[0], texte); //Un joli fond jaune flashy pour s'arracher les oeils DrawFBox(0,0,160,102,3); //On affiche le contenu de texte, il va s'arrêter au premier octet à 0 TextOut(37, 10, 1, 0, texte); //On affiche le contenu de texte à partir du 0xCième octet (12ème) TextOut(60, 24, 1, 0, texte+0xc); //On déclenche un swapbuffers drawPending=1; while(1){ }}

Maintenant, il nous faut le texte à afficher
LOREM.TXT
Lorem ipsum*RYGAR*
Attention, là où j'ai mis les étoiles, il faut utiliser un éditeur hexadicémal pour mettre 00 à la place.
En gros, votre fichier (en hexa) contient :
4c 6f 72 65 6d 20 69 70 73 75 6d 00 52 59 47 41 52 00

Après, il faut votre fichier LOREM.MAK
insert.o
lorem.o
#ALIGN
lorem.txt

le #ALIGN permet de demander à ce que l'élément suivant soit aligné sur un bloc

Et enfin, il suffit de "compiler"... (fichier LOREM.CMD, tout est dans C:LYNX)
cd c:lynx
set PATH=%path%;c:lynxnewcc65bin;c:lynxnewcc65lib;c:lynxnewcc65include;c:lynxdvptlynxer50
cc65 -Ic:lynxnewcc65include "lorem.c"

xopt "lorem.m65"

ra65 "lorem.m65" -o "c:lynxlorem.obj"  
del "lorem.m65"

link65 -r "c:lynxNEWCC65libRUNTIME.RUN" "lorem.obj" "c:lynxnewcc65libc.olb" "c:lynxnewcc65liblynx.olb" -o "lorem.o" 
del "lorem.obj"

rem cd ..

lynxer.exe lorem.mak

make_lnx lorem.lyx -g "lorem" -m "Vince" -b0 256k

cd Handy-0.95
pause
start handy.exe ..lorem.lnx
cd ..


ATTENTION : si vous testez LOREM.O directement, ça ne marchera pas, il faut le contenu de la cartouche DONC le fichier LNX
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

213

PS : dans le fichier texte, en comptant les caractères (et en commençant à 0), on voit que le "R" est à la position numéro 12
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

214

En modifiant un peu, avec "plus" de texte, le tout depuis la rom :
tromb Fichier joint : lorem.lnx

8 lignes de 20 carac par écran, 6 écrans pour un block, 3 blocks... Total, près de 3000 carac... Le tout depuis la ROM, pour "visualiser" le fond change en fonction du block.
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

215

Excellent !!!C'est vrai qu'il est cool vince. Je suis pas près d'aller au lit ce soir moi tongue

Impossible de tester ici au boulot mais je vais déjà poser quelques questions histoires de ne pas être bloqué trop vite ce soir.


éditeur hexadécimal, Google me propose de télécharger des logiciels (je ne peux pas cf je suis au boulot) je vais découvrir quoi en installant cela chez moi ? Un logiciel qui va transformer mon texte "bonjour" par des ligne de ce genre "4c 6f 72 65 6d 20 69 70 73 75 6d 00 52 59 47 41 52 00" et c'est ?
PS : dans le fichier texte, en comptant les caractères (et en commençant à 0), on voit que le "R" est à la position numéro 12 Si on part de 00 c'est pas 11 ?

Est ce que je vais pouvoir faire qqchose de ce genre :
écran titre
petite animation
5/6 page de texte LoadCartDir(2);
petite animation
2/3 page de texte LoadCartDir(3);


avec un fichier MAK du style :
insert.o
lorem.o
#ALIGN
lorem.txt
#ALIGN
lorem2.txt


EDIT :
tu pourrais mettre à dispo le gros fichier TXT que tu as fait pour ta rom lorem de 256ko que je vois comment tu places le texte (voir si ça ressemble au prog de Fadest de ce style "/" pour changer de ligne et &01 &02... pour changer de page.
Mon site sur la LYNX :ZoneLynx

216

Demain test, ou le système écologique global, parfois dans la région. Unis veulent maintenant freins de levure libres. Nous voulons maintenant attacher vos clients. Pas besoin de chocs cliniques, qui se produisent à l'instant t. Nous venons de trouver un acheteur pour lui. emploi du modèle, il ne sera pas verrouiller ou empoisonne la vie, Soft Select.

???? J'ai tout vu, tout lu, presque tout traduit mais rien compris...
Mon site sur la LYNX :ZoneLynx

217

"Lorem ipsum" est un texte "banal" utilisé pour ne pas mettre totototototo, le générateur est là http://fr.lipsum.com/ tu demandes la taille de texte qui t'arrange, après ça veut pas forcémetn dire qqch.

Penses à lire tes mails grin

Pour le multifichier, tu as tout compris. Après libre à toi de voir si tu veux éclater ça en plusieurs fichiers ou sur plusieurs blocs du même fichier...
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

218

RYGAR (./215) :
EDIT :[/b] tu pourrais mettre à dispo le gros fichier TXT que tu as fait pour ta rom lorem de 256ko que je vois comment tu places le texte (voir si ça ressemble au prog de Fadest de ce style "/" pour changer de ligne et &amp;01 &amp;02... pour changer de page.

Non, ça, c'était une convention pour moi, séparer sur une ligne le texte des options de menus par exemples. Et els code de page, c'était pour pouvoir retrouver et charger la page qui va bien, vu que le texte n'était pas affiché séquentiellement (page après page), mais plus à la manière d'un livre dont vous êtes le héros...
avatar
Futur ex éditeur de jeux Atari Lynx et Nintendo Game Boy
https://yastuna-games.com

219

Tout à fait, la rom que j'ai posté s'appuie sur un texte linéaire et le découpe bêtement par page de 8 lignes de 20 caractères. Et pour le coup, vu que je coupe "à la main" y'a pas besoin d'éditeur hexa... Chacun fait sa sauce comme il l'entend, la rom contient des données mais leur format est libre.
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

220

SUPER !!!
Tous marche nickel smile
J'inclus du textes par paquet de 12 ou je veux et quand je veux smile Merci vince pour ce petit programme smile
La place gagnée va même me permettre de garder le texte d'intro sous forme de long sprite qui défilera.

A ce propos je crois avoir déjà posé la question et avoir reçu une réponse négative mais dans le doute je redemande quand je fais déplacer un sprite avec la fonction dir_a = 1 le sprite ce déplace à vitesse 1 si je fais dir_a = 2 le sprite ira 2 fois plus vite mais comment faire pour que le sprite aille deux fois mois vite ? Car évidement dir_a = 0,5 cela ne marche pas sad

Mon site sur la LYNX :ZoneLynx

221

tu fais un "compteur"

//initialisations
char cpt;
cpt=0;
...

{/////ta boucle magique de ton superjeu
if (cpt>2){
SCBX(monSCB)++;
cpt=0;
}
cpt++;

...
}


Et là, lors de la première boucle, cpt vaut 0, il se passe rien pour monSCB
Lors de la seconde, cpt vaut 1, qui n'est pas supérieur(strict) à 2 donc il ne se passe rien pour monSCB
Lors de la troisième, cpt vaut 2, qui n'est pas supérieur(strict) à 2 donc il ne se passe rien pour monSCB
Lors de la quatrième, cpt vaut 3, c'est supérieur à 2, on ajoute 1 à SCBX
Lors de la cinquième, c'est comme la première...

Donc avec ça, t'as un équivalent de dir_a=0,25
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

222

Lorsque je rajoute
char cpt;
cpt=0;
à mon code je me retrouve avec le message d'erreur suivant :
multiply defined global symbol


Et j'en profite pour te demandé si j'ai bien compris ton explication, avant moi j'avais ceci :

for(a=0; 350 > a; a++) {
DrawFBox(0,0,160,102,0);
b=b+dir_b;
if (b<-1000) {b=170; dir_b=-1;}
SCBX(SCBt4) = 0;
SCBY(SCBt4) = b;
DrawSprite(SCBt4);
Vsync();
SwapBuffers(); }


qui ce remplacera par cela :

for(a=0; 350 > a; a++) {
DrawFBox(0,0,160,102,0);
if (cpt>2){
SCBY(SCBt4)++;
cpt=0;
}
cpt++;
DrawSprite(SCBt4);
Vsync();
SwapBuffers(); }



J'ai pas pu essayer à cause de l'erreur dés le départ mais autant déjà réfléchir à la suite smile

Mon site sur la LYNX :ZoneLynx

223

ça m'a l'air correct, l'erreur de départ, c'est parce que tu as mis le code en dehors du main(){...} donc il prend ça pour une variable globale et alors il faut tout faire sur la même ligne pour ne pas qu'il râle char cpt=0;


(et si il râle toujours change le nom "cpt" pour autre chose)
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

224

Oui c'est vrai je mettais char cpt, et cpt=0; en deux lignes juste après les char screen.
Je retente ce soir.
Mon site sur la LYNX :ZoneLynx

225

T'es trop fort vince !
Ca marche suuuuuper bien !!!
Mon site sur la LYNX :ZoneLynx

226

En faisant mon bout de code avec la méthode du cpt pour gérer les déplacements je me souvient d'un aquarium que j'avais programmé il y a quelques années et ou j'avais du créer une 20aine de dir_a dir_b dir_c... et définir tout autant de a, b, c... pour que mes poissons bougent. Cela m'avait pris un temps fou, était source de bug fréquents et occupait surement beaucoup plus de place que nécessaire. Comme quoi on arrive souvent à ce démerder mais y à pas à dire une bonne maitrise ça aide.

Pour une autre rom j'avais du réaliser un compte à rebours, j'avais donc fais 10 sprites c0, c1, c2, c3... pour les chiffres 0, 1, 2, 3... puis j'avais écris un truc de ce genre :

for(a=0; 10 > a; a++) {
SetRGB(c0_pal);
DrawFBox(0,0,160,102,0);
SCBX(SCBc1) = 45;
SCBY(SCBc1) = 45;
DrawSprite(SCBc1);
SCBX(SCBc0) = 50;
SCBY(SCBc0) = 45;
DrawSprite(SCBc0);
Vsync();
SwapBuffers(); } // = 10

for(a=0; 10 > a; a++) {
SetRGB(c0_pal);
DrawFBox(0,0,160,102,0);
SCBX(SCBc0) = 45;
SCBY(SCBc0) = 45;
DrawSprite(SCBc0);
SCBX(SCBc9) = 50;
SCBY(SCBc9) = 45;
DrawSprite(SCBc9);
Vsync();
SwapBuffers(); } // = 09

for(a=0; 10 > a; a++) {
SetRGB(c0_pal);
DrawFBox(0,0,160,102,0);
SCBX(SCBc0) = 45;
SCBY(SCBc0) = 45;
DrawSprite(SCBc0);
SCBX(SCBc8) = 50;
SCBY(SCBc8) = 45;
DrawSprite(SCBc8);
Vsync();
SwapBuffers(); } // = 08

etc etc

Mon compte à rebours allait de 10 à 00 donc ma méthode restait gérable mais si j'avais voulu un compte à rebours de 99 à 00 je n'ose imaginer la galère.

Existe t-il une autre méthode qui aurait pu à l'époque me simplifier la tache ?

Mon site sur la LYNX :ZoneLynx

227

Tu sais qu'il existe des tableaux en C ? hehe
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

228

A l'époque vu la taille de mon compteur j'avais été au plus simple.
Je viens de regarder ce qu'était un tableau...

Si je part sur un truc de ce genre je suis sur la bonne vois ou je me fourvoie ?

case 0 : SCBDATA(rbr) = c0;
case 1 : SCBDATA(rbr) = c1;
case 2 : SCBDATA(rbr) = c2;
case 3 : ....

Mon site sur la LYNX :ZoneLynx

229

RYGAR (./228) :
A l'époque vu la taille de mon compteur j'avais été au plus simple.
Je viens de regarder ce qu'était un tableau...

Si je part sur un truc de ce genre je suis sur la bonne vois ou je me fourvoie ?

case 0 : SCBDATA(rbr) = c0;
case 1 : SCBDATA(rbr) = c1;
case 2 : SCBDATA(rbr) = c2;
case 3 : ....

Je ne sais pas ce que tu veux faire exactement, mais tu peux décider d'utiliser une variable multiple :
char choiximg, choixscb; uchar *spdata[4];// variable à déclarer avant char main() char main() { spdata[0] = SCBa; spdata[1] = SCBb; spdata[2] = SCBc; spdata[3] = SCBd;

puis dans la boucle principale:SCBDATA(spdata[0]) = tab[choiximg%7];// en imaginant que tu as stocké 7 images dans tab

plus loin:SCBDATA(spdata[choixscb]) = tab[choiximg%7];// tu choisi ton scb
Ou alors de sprites multiples, si tu ne ne veux zoomer sur un de ces sprites en particulier indépendanment des autres.
avatar
Travaux, concept of proof, divers :
Megadrive
topics/172-143753-moved-juju-densetsu
Lynx
sections/255-developpeurs-lynx

230

Hum hum c'est très confus pour moi tout ça Beaupixel...
Mais ça m’intéresse de comprendre ce genre de choses.

Comme dis plus haut mon idée c'est un compte à rebours de 99 à 00 (99 98 97 96...)

Je suis parti sur cette voie :

J'ai donc déclaré mes 10 sprites de chiffre 0 1 2 3 4 5 6 7 8 9

extern char c0[];
extern char c1[];
extern char c2[];
extern char c3[];
extern char c4[];
extern char c5[];
extern char c6[];
extern char c7[];
extern char c8[];
extern char c9[];



Dans mon esprit j'avais une idée simple qui ressemblerait à cela :

for(i=0; 2 > i; i++) {

If (I=0; SCBsprite qui change = SCBc9);
If (I=1; SCBsprite qui change = SCBc8);
If (I=2; SCBsprite qui change = SCBc7);

for(a=0; 100 > a; a++) {
SCBX(SCBsprite qui change) = 74;
SCBY(SCBsprite qui change) = 48;
DrawSprite(SCBsprite qui change);
SCBX(SCBc9) = 81;
SCBY(SCBc9) = 48;
DrawSprite(SCBc9);
Vsync();
SwapBuffers(); }

for(a=0; 100 > a; a++) {
SCBX(SCBsprite qui change) = 74;
SCBY(SCBsprite qui change) = 48;
DrawSprite(SCBsprite qui change);
SCBX(SCBc8) = 81;
SCBY(SCBc8) = 48;
DrawSprite(SCBc8);
Vsync();
SwapBuffers(); }

for(a=0; 100 > a; a++) {
SCBX(SCBsprite qui change) = 74;
SCBY(SCBsprite qui change) = 48;
DrawSprite(SCBsprite qui change);
SCBX(SCBc7) = 81;
SCBY(SCBc7) = 48;
DrawSprite(SCBc7);
Vsync();
SwapBuffers(); }

}

Ce qui devrait donner pour la première boucle (quand I vaut 0)
99
98
97
Ensuite on passe à la seconde boucle I=1 donc
89
88
87
Puis troisième boucle I=2 donc
79
78
77

Ce qui me manque c'est la façon de déclarer ce "sprite qui change" c'est là ou je pense entre en jeu la déclaration à variable multiples mais malgré des choses trouvé sur le net je sèche.

Sans vouloir trop abusé, pourrais tu me montrer en utilisant ma numérotation c1 c2 c3... comment déclarer cette variable multiple.


Mon site sur la LYNX :ZoneLynx

231

Alors, à l'arrache...

en dehors de ton main, tu fais :
char * sprite_pour_chiffre(chiffre)char chiffre;{switch(chiffre){case 0:return c0;case 1:return c1;case 2:return c2;case 3:return c3;case 4:return c4;case 5:return c5;case 6:return c6;case 7:return c7;case 8:return c8;case 9:return c9;}}

cette fonction renverra le tableau correspondant au chiffre qui va bien.

il te suffit de mettre ça dans ton "main"
char compteur;SCBX(SCB_UNITES) = 81; SCBY(SCB_UNITES) = 50; SCBX(SCB_DIZAINES) = 74; //les dizaines à gauche, ça parait "logique" SCBY(SCB_DIZAINES) = 50; for(compteur=99;compteur>=0;compteur--){SCBDATA(SCB_UNITES) = sprite_pour_chiffre(compteur % 10); SCBDATA(SCB_DIZAINES) = sprite_pour_chiffre((compteur-(compteur % 10))/10); // ça peut ptet marcher avec sprite_pour_chiffre(compteur/10), théoriquement ça doit rester un entier mais j'ai vu des trucs bizarres...DrawSprite(SCB_UNITES); DrawSprite(SCB_DIZAINES); for (char i=0;i<120;i++) vsync();//si tu veux le temps de lire ton compteur...SwapBuffers(); }
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

232

vince (./231) :
Alors, à l'arrache...

en dehors de ton main, tu fais :
char * sprite_pour_chiffre(chiffre)char chiffre;{switch(chiffre){case 0:return c0;case 1:return c1;case 2:return c2;case 3:return c3;case 4:return c4;case 5:return c5;case 6:return c6;case 7:return c7;case 8:return c8;case 9:return c9;}}

cette fonction renverra le tableau correspondant au chiffre qui va bien.

il te suffit de mettre ça dans ton "main"
char compteur;SCBX(SCB_UNITES) = 81; SCBY(SCB_UNITES) = 50; SCBX(SCB_DIZAINES) = 74; //les dizaines à gauche, ça parait "logique" SCBY(SCB_DIZAINES) = 50; for(compteur=99;compteur>=0;compteur--){SCBDATA(SCB_UNITES) = sprite_pour_chiffre(compteur % 10); SCBDATA(SCB_DIZAINES) = sprite_pour_chiffre((compteur-(compteur % 10))/10); // ça peut ptet marcher avec sprite_pour_chiffre(compteur/10), théoriquement ça doit rester un entier mais j'ai vu des trucs bizarres...DrawSprite(SCB_UNITES); DrawSprite(SCB_DIZAINES); for (char i=0;i<120;i++) vsync();//si tu veux le temps de lire ton compteur...SwapBuffers(); }

autre solution (merci zeph&0² pour le conseil) :

tu déclares (en dehors de ton main)char *tabchiffres[]={c0,c1,c2,c3,c4,c5,c6,c7,c8,c9};
et au lieu d'appeler sprite_pour_chiffre(chiffre), tu appelles tabchiffres[chiffre]
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

233

Ha avec les c1 et autre c9 j'ai un peu compris je pense merci vince smile

(Bon Ça ne marche pas mais j'y reviens plus tard.)

D'abord je voudrais être sur d'avoir bien compris,

int sprite_pour_chiffre(chiffre)
char chiffre;
{
switch(chiffre){
case 0:
return c0;
case 1:
return c1;

cela veut dire que l'on va créer un tableau qui va s'appeler sprite_pour_chiffre et qui lorsqu'on l'affichera affichera le sprite chiffre qui lui pourra être un des 10 éléments c1 c2 c3... ou c9 que l'on a rangé dans des cases grâce à la fonction switch. C'est bien ça ?

char compteur;
SCBX(SCB_UNITES) = 81;
SCBY(SCB_UNITES) = 50;
SCBX(SCB_DIZAINES) = 74;
SCBY(SCB_DIZAINES) = 50;

Là je ne comprend pas bien, tu appelles des "choses" que l'on a pas défini avant. Ne doit t-on pas préalablement déclarer les "choses" que sont compteur unités et dizaines ?

La troisième parties je verrais plus tard.


Pour en revenir au pb quand je comil tous cela il aime pas le char compteur; , il me dit plusieurs fois
invalid expression
missing semicolon

puis
fatal error
curtok = 20
nxttok = 50


Mon site sur la LYNX :ZoneLynx

234

ah oui, il faut définir SCB_UNITES et SCB_DIZAINES (en assembleur généralement dans les exemples)

extern char SCB_UNITES[];
extern char SCB_DIZAINES[];
#asm
_SCB_UNITES dc.b $C7,$90,$20 
          dc.w 0,0 
          dc.w 80,50,$100,$100 
          dc.b $0f,$b9,$ab,$67,$89,$ab,$cd,$ef 
_SCB_DIZAINES dc.b $C7,$90,$20 
          dc.w 0,0 
          dc.w 70,50,$100,$100 
          dc.b $0f,$b9,$ab,$67,$89,$ab,$cd,$ef 
#endasm

0xC7 dans SPRCTL0 => 0b11000111 => couleurs sur trois+1 bits(*) // pas de flip horz ou vert // ombré (l'indice de palette 0 sert pour la transparence)
0x90 dans SPRCTL1 => 0b10010000 => littéral // rechargement Hsize&Vsize
0x20 dans SPRCOLL => 0b00100000 => pas de collisions

(*) c'est pour que le sprite soit "compréhensible à l'oeil nu", pour le coup, sur un bit ça suffirait)

pour tes tableaux de sprite, tu peux avoir par exemple
char c1[]={
4,0x00,0x10,0x00, /*001000*/
4,0x01,0x10,0x00, /*011000*/
4,0x10,0x10,0x00, /*101000*/
4,0x00,0x10,0x00, /*001000*/
4,0x00,0x10,0x00, /*001000*/
4,0x00,0x10,0x00, /*001000*/
4,0x01,0x11,0x00, /*011100*/
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

235

Oula la je commence à être perdu ça va trop vite !

voila ce que je fais :

[source=as3]#include <stdlib.h>
#include <lynx.h>
#include <lynxlib.h>
#include "inc\c0.pal"

#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 c0[];
extern char c1[];
extern char c2[];
extern char c3[];
extern char c4[];
extern char c5[];
extern char c6[];
extern char c7[];
extern char c8[];
extern char c9[];


extern char SCBc0[];
#asm
_SCBc0 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

extern char SCBc1[];
#asm
_SCBc1 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

extern char SCBc2[];
#asm
_SCBc2 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

extern char SCBc3[];
#asm
_SCBc3 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

extern char SCBc4[];
#asm
_SCBc4 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

extern char SCBc5[];
#asm
_SCBc5 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

extern char SCBc6[];
#asm
_SCBc6 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

extern char SCBc7[];
#asm
_SCBc7 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

extern char SCBc8[];
#asm
_SCBc8 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

extern char SCBc9[];
#asm
_SCBc9 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




extern char SCB_UNITES[];
extern char SCB_DIZAINES[];
#asm
_SCB_UNITES dc.b $C7,$90,$20
dc.w 0,0
dc.w 80,50,$100,$100
dc.b $0f,$b9,$ab,$67,$89,$ab,$cd,$ef
_SCB_DIZAINES dc.b $C7,$90,$20
dc.w 0,0
dc.w 70,50,$100,$100
dc.b $0f,$b9,$ab,$67,$89,$ab,$cd,$ef
#endasm



char *tabchiffres[]={c0,c1,c2,c3,c4,c5,c6,c7,c8,c9};


int i;



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



char main()
{

InitIRQ();
CLI;
SetBuffers(SCREEN, RENDER ,0);
SetRGB(c0_pal);


SCBDATA(SCBc0) = c0;
SCBDATA(SCBc1) = c1;
SCBDATA(SCBc2) = c2;
SCBDATA(SCBc3) = c3;
SCBDATA(SCBc4) = c4;
SCBDATA(SCBc5) = c5;
SCBDATA(SCBc6) = c6;
SCBDATA(SCBc7) = c7;
SCBDATA(SCBc8) = c8;
SCBDATA(SCBc9) = c9;


char compteur;
SCBX(SCB_UNITES) = 81;
SCBY(SCB_UNITES) = 50;
SCBX(SCB_DIZAINES) = 74;
SCBY(SCB_DIZAINES) = 50;

for(compteur=99;compteur>=0;compteur--){
SCBDATA(SCB_UNITES) = tabchiffres(compteur % 10);
SCBDATA(SCB_DIZAINES) = tabchiffres((compteur-(compteur % 10))/10);
DrawSprite(SCB_UNITES);
DrawSprite(SCB_DIZAINES);
for (char i=0;i<120;i++) vsync();//si tu veux le temps de lire ton compteur...
SwapBuffers();
}


}}[/source]

Mais cela ne marche pas il bloque à la ligne 174.

J'ai essayé de déplacer cette ligne "char compteur;" hors du main ce qui me donne comme erreur après compil "illegal function call" aux lignes
SCBDATA(SCB_UNITES) = tabchiffres(compteur % 10);
SCBDATA(SCB_DIZAINES) = tabchiffres((compteur-(compteur % 10))/10);
Mon site sur la LYNX :ZoneLynx

236

alors, au début du code: #include <stdlib.h> #include <lynx.h> #include <lynxlib.h> #include "inc\c0.pal" #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); // ------------------------------------ char compteur; int i, unite, dizaine; // clip du sprite chiffres: 0123456789 extern uchar c0[]; extern uchar c1[]; extern uchar c2[]; extern uchar c3[]; extern uchar c4[]; extern uchar c5[]; extern uchar c6[]; extern uchar c7[]; extern uchar c8[]; extern uchar c9[]; uchar *chtab[10] = {c0, c1, c2, c3, c4, c5, c6, c7, c8,c9}; uchar _SCB_UNITES[]; // déclaration d'un nouveau controleur de sprite uchar _SCB_DIZAINES[]; // déclaration d'un nouveau controleur de sprite #asm _SCB_UNITES 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 _SCB_DIZAINES 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 // ------------------------------------ void Vsync() { #asm vretrace: lda $fd0a bne vretrace #endasm }

puis:
char main() { InitIRQ(); CLI; SetBuffers(SCREEN, RENDER ,0); SetRGB(c0_pal); SCBX(SCB_UNITES) = 81; SCBY(SCB_UNITES) = 50; SCBX(SCB_DIZAINES) = 74; SCBY(SCB_DIZAINES) = 50; SCBNEXT(_SCB_UNITES) = _SCB_DIZAINES; // chainage de sprite compteur = 99; // Boucle principale : while(1) { Vsync(); SwapBuffers(); unite = compteur % 10; dizaine = compteur / 10 % 10; SCBDATA(_SCB_UNITES) = chtab[unite%10]; SCBDATA(_SCB_DIZAINES) = chtab[dizaine%10]; DrawSprite(SCB_UNITES); // un seul drawsprite jean-philippe } }
avatar
Travaux, concept of proof, divers :
Megadrive
topics/172-143753-moved-juju-densetsu
Lynx
sections/255-developpeurs-lynx

237

sad
Cela ne marche pas et malheureusement je dois partir en déplacement pour 4 jours sans PC pour faire de nouvelles tentatives sad sad sad

Avec ma dernière tentative vite fait je pense que trop de chose entre la méthode de vince et la tienne Philippe entre en collision.

Je me re-penche sérieusement dessus à mon retour.

Voici ma dernière tentative foireuse wink

[source=as3]#include <stdlib.h>
#include <lynx.h>
#include <lynxlib.h>
#include "inc\c0.pal"

#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);

// ------------------------------------
int score, unite, dizaine;
char compteur;
// clip du sprite chiffres: 0123456789

extern uchar c0[];
extern uchar c1[];
extern uchar c2[];
extern uchar c3[];
extern uchar c4[];
extern uchar c5[];
extern uchar c6[];
extern uchar c7[];
extern uchar c8[];
extern uchar c9[];

uchar *chtab[10] = {c0, c1, c2, c3, c4, c5, c6, c7, c8,c9};

uchar _SCB_UNITES[]; // déclaration d'un nouveau controleur de sprite
uchar _SCB_DIZAINES[]; // déclaration d'un nouveau controleur de sprite
#asm
_SCB_UNITES
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
_SCB_DIZAINES
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




extern char SCBc0[];
#asm
_SCBc0 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

extern char SCBc1[];
#asm
_SCBc1 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

extern char SCBc2[];
#asm
_SCBc2 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

extern char SCBc3[];
#asm
_SCBc3 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

extern char SCBc4[];
#asm
_SCBc4 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

extern char SCBc5[];
#asm
_SCBc5 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

extern char SCBc6[];
#asm
_SCBc6 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

extern char SCBc7[];
#asm
_SCBc7 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

extern char SCBc8[];
#asm
_SCBc8 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

extern char SCBc9[];
#asm
_SCBc9 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 i;



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



char main()
{
InitIRQ();
CLI;
SetBuffers(SCREEN, RENDER ,0);
SetRGB(c0_pal);

SCBNEXT(_SCB_UNITES) = _SCB_DIZAINES;
SCBX(SCB_UNITES) = 81;
SCBY(SCB_UNITES) = 50;
SCBX(SCB_DIZAINES) = 74;
SCBY(SCB_DIZAINES) = 50;
compteur=99;


SCBDATA(SCBc0) = c0;
SCBDATA(SCBc1) = c1;
SCBDATA(SCBc2) = c2;
SCBDATA(SCBc3) = c3;
SCBDATA(SCBc4) = c4;
SCBDATA(SCBc5) = c5;
SCBDATA(SCBc6) = c6;
SCBDATA(SCBc7) = c7;
SCBDATA(SCBc8) = c8;
SCBDATA(SCBc9) = c9;


char compteur;
SCBX(SCB_UNITES) = 81;
SCBY(SCB_UNITES) = 50;
SCBX(SCB_DIZAINES) = 74;
SCBY(SCB_DIZAINES) = 50;

for(compteur=99;compteur>=0;compteur--){

unite = compteur% 10;
dizaine = compteur/ 10 % 10;
SCBDATA(_SCB_UNITES) = chtab[unite%10];
SCBDATA(_SCB_DIZAINES) = chtab[dizaine%10];

DrawSprite(SCB_UNITES); // un seul drawsprite jean philipe

for (char i=0;i<120;i++) vsync();//si tu veux le temps de lire ton compteur...
SwapBuffers();
}


}}[/source][source=as3]#include <stdlib.h>
#include <lynx.h>
#include <lynxlib.h>
#include "inc\c0.pal"

#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);

// ------------------------------------
int score, unite, dizaine;
char compteur;
// clip du sprite chiffres: 0123456789

extern uchar c0[];
extern uchar c1[];
extern uchar c2[];
extern uchar c3[];
extern uchar c4[];
extern uchar c5[];
extern uchar c6[];
extern uchar c7[];
extern uchar c8[];
extern uchar c9[];

uchar *chtab[10] = {c0, c1, c2, c3, c4, c5, c6, c7, c8,c9};

uchar _SCB_UNITES[]; // déclaration d'un nouveau controleur de sprite
uchar _SCB_DIZAINES[]; // déclaration d'un nouveau controleur de sprite
#asm
_SCB_UNITES
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
_SCB_DIZAINES
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




extern char SCBc0[];
#asm
_SCBc0 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

extern char SCBc1[];
#asm
_SCBc1 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

extern char SCBc2[];
#asm
_SCBc2 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

extern char SCBc3[];
#asm
_SCBc3 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

extern char SCBc4[];
#asm
_SCBc4 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

extern char SCBc5[];
#asm
_SCBc5 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

extern char SCBc6[];
#asm
_SCBc6 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

extern char SCBc7[];
#asm
_SCBc7 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

extern char SCBc8[];
#asm
_SCBc8 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

extern char SCBc9[];
#asm
_SCBc9 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 i;



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



char main()
{
InitIRQ();
CLI;
SetBuffers(SCREEN, RENDER ,0);
SetRGB(c0_pal);

SCBNEXT(_SCB_UNITES) = _SCB_DIZAINES;
SCBX(SCB_UNITES) = 81;
SCBY(SCB_UNITES) = 50;
SCBX(SCB_DIZAINES) = 74;
SCBY(SCB_DIZAINES) = 50;
compteur=99;


SCBDATA(SCBc0) = c0;
SCBDATA(SCBc1) = c1;
SCBDATA(SCBc2) = c2;
SCBDATA(SCBc3) = c3;
SCBDATA(SCBc4) = c4;
SCBDATA(SCBc5) = c5;
SCBDATA(SCBc6) = c6;
SCBDATA(SCBc7) = c7;
SCBDATA(SCBc8) = c8;
SCBDATA(SCBc9) = c9;


char compteur;
SCBX(SCB_UNITES) = 81;
SCBY(SCB_UNITES) = 50;
SCBX(SCB_DIZAINES) = 74;
SCBY(SCB_DIZAINES) = 50;

for(compteur=99;compteur>=0;compteur--){

unite = compteur% 10;
dizaine = compteur/ 10 % 10;
SCBDATA(_SCB_UNITES) = chtab[unite%10];
SCBDATA(_SCB_DIZAINES) = chtab[dizaine%10];

DrawSprite(SCB_UNITES); // un seul drawsprite jean philipe

for (char i=0;i<120;i++) vsync();//si tu veux le temps de lire ton compteur...
SwapBuffers();
}


}}[/source]
Mon site sur la LYNX :ZoneLynx

238

#include <lynx.h>#include <lynxlib.h>char SCREEN[8160] at (MEMTOP-16320);char RENDER[8160] at (MEMTOP-8160);char drawPending;VBL() interrupt{ if (drawPending) { SwapBuffers(); drawPending = 0; }}void Vsync() { #asm vretrace: lda $fd0a bne vretrace #endasm } char c0[]={ 4,0x01,0x11,0x00, 4,0x10,0x00,0x10, 4,0x10,0x00,0x10, 4,0x10,0x00,0x10, 4,0x10,0x00,0x10, 4,0x10,0x00,0x10, 4,0x01,0x11,0x00,0};char c1[]={ 4,0x00,0x10,0x00, /*001000*/ 4,0x01,0x10,0x00, /*011000*/ 4,0x10,0x10,0x00, /*101000*/ 4,0x00,0x10,0x00, /*001000*/ 4,0x00,0x10,0x00, /*001000*/ 4,0x00,0x10,0x00, /*001000*/ 4,0x01,0x11,0x00, /*011100*/0};char c2[]={ 4,0x01,0x11,0x00, 4,0x10,0x00,0x10, 4,0x00,0x00,0x10, 4,0x00,0x01,0x00, 4,0x00,0x10,0x00, 4,0x01,0x00,0x00, 4,0x11,0x11,0x10,0};char c3[]={ 4,0x11,0x11,0x00, 4,0x00,0x00,0x10, 4,0x00,0x11,0x00, 4,0x00,0x01,0x00, 4,0x00,0x00,0x10, 4,0x00,0x00,0x10, 4,0x11,0x11,0x00,0};char c4[]={ 4,0x00,0x01,0x00, 4,0x00,0x11,0x00, 4,0x01,0x01,0x00, 4,0x01,0x01,0x00, 4,0x11,0x11,0x10, 4,0x00,0x01,0x00, 4,0x00,0x01,0x00,0};char c5[]={ 4,0x11,0x11,0x10, 4,0x10,0x00,0x00, 4,0x10,0x00,0x00, 4,0x11,0x11,0x00, 4,0x00,0x00,0x10, 4,0x00,0x00,0x10, 4,0x11,0x11,0x00,0};char c6[]={ 4,0x01,0x11,0x00, 4,0x10,0x00,0x00, 4,0x10,0x00,0x00, 4,0x11,0x11,0x00, 4,0x10,0x00,0x10, 4,0x10,0x00,0x10, 4,0x01,0x11,0x00,0};char c7[]={ 4,0x11,0x11,0x10, 4,0x00,0x01,0x00, 4,0x00,0x01,0x00, 4,0x00,0x10,0x00, 4,0x00,0x10,0x00, 4,0x01,0x00,0x00, 4,0x01,0x00,0x00,0};char c8[]={ 4,0x01,0x11,0x00, 4,0x10,0x00,0x10, 4,0x10,0x00,0x10, 4,0x01,0x11,0x00, 4,0x10,0x00,0x10, 4,0x10,0x00,0x10, 4,0x01,0x11,0x00,0};char c9[]={ 4,0x01,0x11,0x00, 4,0x10,0x00,0x10, 4,0x10,0x00,0x10, 4,0x01,0x11,0x10, 4,0x00,0x00,0x10, 4,0x00,0x01,0x00, 4,0x01,0x10,0x00,0};char pal[] = {0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,0x00,0x08,0x0F,0x08,0x00,0x0F,0x00,0x00,0x00, //0G0x00,0x0F,0x4F,0x0F,0x00,0xF0,0xF8,0x00,0x88,0x8F,0xFF,0xFF,0xFF,0x80,0x00,0x00 //BR};void Vsync() {#asmvretrace: lda $fd0a bne vretrace#endasm}char WaitButton(){ char key; while ( (key = joystick) == 0); while ( joystick ); return key;}extern char SCB_UNITES[];extern char SCB_DIZAINES[];#asm_SCB_UNITES dc.b $C7,$90,$20 dc.w 0,0 dc.w 80,50,$100,$100 dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef _SCB_DIZAINES dc.b $C7,$90,$20 dc.w 0,0 dc.w 73,50,$100,$100 dc.b $01,$23,$45,$67,$89,$ab,$cd,$ef #endasmchar *tabchiffres[]={c0,c1,c2,c3,c4,c5,c6,c7,c8,c9};char main(){ char i; char j; InitIRQ(); CLI; SetBuffers(SCREEN, RENDER ,0); InstallIRQ(2,VBL); EnableIRQ(2); EnableIRQ(1); SetRGB(pal); while(1){ for(i=99;i>=0;i--){ DrawFBox(0,0,160,102,0); SCBDATA(SCB_UNITES)=tabchiffres[i%10]; SCBDATA(SCB_DIZAINES)=tabchiffres[i/10]; DrawSprite(SCB_DIZAINES); DrawSprite(SCB_UNITES); drawPending=1; for(j=0;j<50;j++) Vsync(); } }}
(chez moi, ça marche)
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

239

Ultime tentative avec ton code vince et non ça marche pas MAIS ! si je rajoute un "int i;" ça marche !!

Merci à vous deux les gars. Je reviens vers vous d'ici 4-5 jours avec tout un tas de questions histoires de comprendre vraiment le fonctionnement du truc.

Philippe apparemment tu n'utilise pas la même méthode que vince et j'aimerais pouvoir comprendre aussi comment tu fais donc si tu pouvais m'expliquer dans mon code deux poste plus haut pourquoi cela n'as pas marché je suis preneur.

Merci encore à vous deux et à dans qque jours wink

Mon site sur la LYNX :ZoneLynx

240

RYGAR (./239) :
Ultime tentative avec ton code vince et non ça marche pas MAIS ! si je rajoute un "int i;" ça marche !!

Merci à vous deux les gars. Je reviens vers vous d'ici 4-5 jours avec tout un tas de questions histoires de comprendre vraiment le fonctionnement du truc.

Philippe apparemment tu n'utilise pas la même méthode que vince et j'aimerais pouvoir comprendre aussi comment tu fais donc si tu pouvais m'expliquer dans mon code deux poste plus haut pourquoi cela n'as pas marché je suis preneur.

Merci encore à vous deux et à dans qque jours wink
tu as oublié de mettre la boucle principale avec cette commande:
while(1)



Et après compteur = 99; tu met les lignes suivantes:
SCBDATA(SCBc0) = c0; SCBDATA(SCBc1) = c1; SCBDATA(SCBc2) = c2; SCBDATA(SCBc3) = c3; SCBDATA(SCBc4) = c4; SCBDATA(SCBc5) = c5; SCBDATA(SCBc6) = c6; SCBDATA(SCBc7) = c7; SCBDATA(SCBc8) = c8; SCBDATA(SCBc9) = c9; char compteur; SCBX(SCB_UNITES) = 81; SCBY(SCB_UNITES) = 50; SCBX(SCB_DIZAINES) = 74; SCBY(SCB_DIZAINES) = 50;
alors que c'est inutile.



Pour décrementer, utilise une autre variable, comme:
au début:char tempa;

après char main() :compteur = 99; tempa = 8;

dans la boucle principale :tempa-=1; if (tempa==0) { tempa=8; compteur-=1 if (compteur==0) compteur=99; }
et si tu as oublié de mettre un sprite pour le fond, met donc un DrawFBox(0,0,160,102,0);
au début de la boucle principale :while(1) { Vsync(); SwapBuffers(); DrawFBox(0,0,160,102,0);
code complet:// jp 17/12/2012 #include <stdlib.h> #include <lynx.h> #include <lynxlib.h> #include "inc\c0.pal" #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); // ------------------------------------ char tempa, compteur; int i, unite, dizaine; // clip du sprite chiffres: 0123456789 extern uchar c0[]; extern uchar c1[]; extern uchar c2[]; extern uchar c3[]; extern uchar c4[]; extern uchar c5[]; extern uchar c6[]; extern uchar c7[]; extern uchar c8[]; extern uchar c9[]; uchar *chtab[10] = {c0, c1, c2, c3, c4, c5, c6, c7, c8,c9}; uchar SCB_UNITES[]; // déclaration d'un nouveau controleur de sprite uchar SCB_DIZAINES[]; // déclaration d'un nouveau controleur de sprite #asm _SCB_UNITES 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 _SCB_DIZAINES 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 // ------------------------------------ void Vsync() { #asm vretrace: lda $fd0a bne vretrace #endasm } char main() { InitIRQ(); CLI; SetBuffers(SCREEN, RENDER ,0); SetRGB(c0_pal); SCBX(SCB_UNITES) = 81; SCBY(SCB_UNITES) = 50; SCBX(SCB_DIZAINES) = 74; SCBY(SCB_DIZAINES) = 50; SCBNEXT(SCB_UNITES) = SCB_DIZAINES; // chainage de sprite compteur = 99; tempa = 8; // ********************* Boucle principale ********************* while(1) { Vsync(); SwapBuffers(); DrawFBox(0,0,160,102,0); tempa-=1; if (tempa==0) { tempa=8; compteur-=1; if (compteur==0) compteur=99; } unite = compteur % 10; dizaine = compteur / 10 % 10; SCBDATA(SCB_UNITES) = chtab[unite%10]; SCBDATA(SCB_DIZAINES) = chtab[dizaine%10]; DrawSprite(SCB_UNITES); // un seul drawsprite jean-philippe } // ********************* Fin de la Boucle principale ********************* }
avatar
Travaux, concept of proof, divers :
Megadrive
topics/172-143753-moved-juju-densetsu
Lynx
sections/255-developpeurs-lynx