1

Voici mon 1er tutoriel, ou plutôt dans le cas présent programme commenté, car je pense que les commentaires suffisent à comprendre comment fonctionne le programme.
Il s'agit ici d'un starfield, ou champ d'étoiles en français. C'est un petit effet graphique très simple à faire et qui a un rendu sympathique.

Vous pouvez télécharger la rom à cette adresse : http://membres.lycos.fr/lynxweb/download/roms/stars.o
);        SwapBuffers();     } }et voici le code source commenté : #include <lynx.h> #include <lynxlib.h> #include <stdlib.h> // StarField par D@md@m - 23/12/2003 // --------------------------------- // cette démo affiche un champ d'étoiles // (pixels) en déplacement en 3 plans // // http://lynxweb.atari.org // La palette de couleurs, ici des niveaux de gris char pal[]={      0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,      0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF}; // si la palette est dans un fichier externe on peut l'appeler de la façon suivante : // #include "stars.pal" // Nombre maximum d'étoiles #define MAXSTARS 40 // structure d'une étoile struct TStar {      int x, y;          // position      unsigned char plane;     // plan }stars[MAXSTARS]; // Déclaration du sprite qui efface l'écran extern char clsSCB[]; extern uchar cls_color; #asm ; sprite utilisé pour effacer le buffer de collision                 dc.w 0                          ; collision depository _clsSCB:        dc.b $c0,$90,$00                ; le numéro de collision est 0!                 dc.w 0,cls_data                 dc.w 0,0                        ; X,Y                 dc.w 160*$100,102*$100          ; 160*102 pixels _cls_color:     dc.b $00 ; data: 1*1 pixel cls_data        dc.b 2,$10,0 #endasm /*********************************************/ /* Autorise la syncronisation de l'affichage */ extern uchar VBLflag; #asm _VBLflag = $a0 #endasm #define VSYNC {++VBLflag;while( VBLflag );} VBL() interrupt {    VBLflag = 0; /* L'interruption VBL vient d'occurir, le flag est mis à 0 */ } /*********************************************/ /***************************/ /* Attend un certain temps */ /***************************/ WaitTicks(waitticks) uchar waitticks; {   uchar tick;   tick = 0;   while (tick < waitticks)     // jusqu'à la valeur que l'on souhaite           {      VSYNC;               // on attend la synchronisation verticale de l'écran      ++tick;      } } /***********************************************/ /* Efface l'écran _et_ le buffer de collision  */ /***********************************************/ CLS(nColor) uchar nColor; {    cls_color = nColor;  // rapide et sale    DrawSprite(clsSCB); } /*********************/ /* main              */ /*********************/ main() { register uchar i; InitIRQ(); InstallIRQ(2,VBL); EnableIRQ(2);  CLI; SetBuffers(0xa000, 0xc000,0);          // déclaration des buffers d'écran _SetRGB(pal);                    // chargement de la palette // génère des étoiles au hasard     for (i=0; i<MAXSTARS; i++)     {         stars[i].x = random() % 160;     //position x de l'étoile         stars[i].y = random() % 102;     //position y de l'étoile         stars[i].plane = random() % 3;     // couleur et plan de l'étoile     } // boucle principale     for (;;)     {     // efface l'écran        CLS(0);     // mise à jour des étoiles        for (i=0; i<MAXSTARS; i++)        {         // déplace l'étoile à droite, la vitesse dépendant du plan de l'étoile            stars[i].x += (1+stars[i].plane)*1;         // vérifie si l'étoile sort de l'écran à droite            if (stars[i].x>160)            {            // si oui, réinitialise la position x de l'étoile               stars[i].x = 0;            // et change la position y au hasard               stars[i].y = random() % 102;            }         // affiche l'étoile            SetPixel(stars[i].x, stars[i].y, (1+stars[i].plane)*5);     // x, y, couleur      // en utilisant le DrawFBox à la place du set pixel vous pouvez dessiner des "étoiles" plus grosses         //DrawFBox(stars[i].x, stars[i].y, 2, 2, (1+stars[i].plane)*5);     // x, y, longueur x, longueur y, couleur        }     // affiche l'écran complet        WaitTicks(1

Vous pouvez toujours me posez des questions au cas où. Attention, je suis débutant en programmation en C et sur Lynx, alors il peut y avoir des choses pas très bien faites, veuillez m'en excuser d'avance.

Previously known as Damdam

2

Je me répond à moi même, car j'ai des questions à poser sur mon propre programme embarrassed
Comme nombre maximum d'étoiles, j'ai mis 40 car je me suis aperçu que au-delà ça ralentit énormément. Je suis surpris car je pensais pouvoir afficher sans problèmes plus de pixels que ça. Je suppose donc que ça vient de mon programme, mais je n'ai aucune idée de ce qui pourrait améliorer la vitesse... Vince (ou quelqu'un d'autre wink), quand tu rentres de vacances, si tu peux jeter un oeil rapidement wink
Previously known as Damdam

3

Je me suis fait avoir, je croyais que c'était un starfield venant du fond 8)
En fait c'est en latéral, marrant smile

Par curiosité tu fais ça avec koa?
Le 6502, le moteur de sprites de suzy ou son copro?

Voila, sinon bien joué smile

Tient j'ai une question pour Vince, c'est normal que les scroll de Beast ont quelques saccades sur Handy (emu à 100% en CPU)?
Cet émulateur gère pas parfaitement la VBL du Lynx?

4

la structure du programme, y'a pas trop à y redire, par contre, l'utilisation de "setpixel" est suicidaire... cette fonction est très lente, car, elle crée un sprite, puis y met ton point, puis l'affiche... et le tout en 16 bits

en créant toi même les sprites au préalable et en te limitant à 8 bits (coordonnées entre 0 et 256) tu devrais facilement multiplier par 10 ou 20 la vitesse...
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

5

Merci !! Trop de choses à faire et pas assez de temps rahhhhhh mourn

6

Pocket Magazine :
Merci !! Trop de choses à faire et pas assez de temps rahhhhhh mourn

laisses moi deviner, ta résolution n°1 pour 2004 est la même que la mienne ?

-Trouver du temps

smile


PS : en fait cette année je me calme, j'ai rien dit le soir du réveillon, ça porte malheur... (l'an passé j'avais pris pour résolution de me trouver un appart... c'est que ça marche ces conneries...)
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

7

-

8

non

il faut absolument passer par la sprite engine la raison en est simple, le driver écran est inclus dans la sprite engine et n'est pas adressé.
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

9

Chaque année c'est la même résolution, du temps, toujours et encore du temps pour faire des choses grin

10

Xerus :
Je me suis fait avoir, je croyais que c'était un starfield venant du fond 8)
En fait c'est en latéral, marrant smile

Par curiosité tu fais ça avec koa?
Le 6502, le moteur de sprites de suzy ou son copro?

Voila, sinon bien joué smile

Salut Xerus, merci pour le compliment, pour les questions techniques pose-les plutôt à Vince, je suis pas encore très au fait du fonctionnement de la console. En fait les programmes que je fais sont basés sur les sources en C des démos de Matthias Domin. D'après la réponse de Vince il semblerait que ce soit avec le moteur de sprites wink
vince :
la structure du programme, y'a pas trop à y redire, par contre, l'utilisation de "setpixel" est suicidaire... cette fonction est très lente, car, elle crée un sprite, puis y met ton point, puis l'affiche... et le tout en 16 bits
en créant toi même les sprites au préalable et en te limitant à 8 bits (coordonnées entre 0 et 256) tu devrais facilement multiplier par 10 ou 20 la vitesse...

Oki, j'imagine que la fonction "DrawFBox" est aussi lente voir plus alors...

Créer des sprites au préalable n'est pas un problème, par contre comment se limiter à 8 bits? Je comprend pas trop comment tout ça fonctionne... J'ai simplement vu la fonction SetPixel et je me suis dit que ça devait être adapté wink
Previously known as Damdam

11

-

12

t'es obligé de passer par la sprite engine pour afficher, la seule astuce que sage utilise dans sa démo c'est qu'il travaille le buffer d'affichage (lequel buffer est obligatoirement utilisé par la sprite engine)

maintenant c'est vrai t'as raison de dire qe tapper dans ce buffer != jouer avec des sprites, mais l'adressage direct de l'écran reste impossible
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

13

-

14

bah si tu utilise putpixel & co, si c'est un passage obligé, maintenant la sprite engine traite des infos en 16bits et pas le cpu (qui lui est un 6502 8 bits) donc si tu te fais un putpixel de brutos qui joue avec le buffer tu risque de perdre en perofrmance par rapport à l'utilisation des sprites...

pour faire un scrolling latéral simple (un plan) il suffit de faire (en asm) avant chaque affichage :

inc HOFF
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

15

-

16

-

17

Oui en C, plus facile de commencer par quelque chose que je connais un peu. Ça va pour les choses simples, mais globalement je suis pas mal largué quand même, je fais beaucoup d'expérimentations et je me tape plus de murs mur que j'ai de réussites grin

Vince > J'ai pas compris comment limiter les sprites à 8 bits, et je sais même pas à quoi ça correspond techniquement. J'ai cherché un peu dans la doc mais j'ai rien compris triso

Une autre question : Comment faire pour changer une couleur de mon sprite? J'ai bien regardé le tuto 2 de Matthias Domin mais ça reste flou... Faut utiliser obligatoirement la compression quand on crée le .obj? Y'a pas de fonction en C pour changer la couleur simplement ( du genre SCBcolor(monspriteSCB)=5; ) ?
Previously known as Damdam

18

-

19

Bon bah on a un dvpeur de plus sur Lynx, c'est cool smile

20

Orion, j'ai cru lire que tu avais déjà codé en asm 68HC11, si c'est bel et bien le cas, tu verras pas trop de différences dans la philosophie...
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

21

damdam : tu n'as même pas besoin d'une fonction pour changer la couleur d'un sprite, il n'y a qu'un octet à modifier

pour l'utilisation en mode exclusif 8 bits, il suffit de ne pas utiliser un monde de plus de 256*256 (en fait se limiter au quart supérieur gauche du monde global par défaut)
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

22

-

23

BASIC11 de controlord ? si c'est le cas, tu peux continuer à t'en servir ça restera en partie compatible...
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

24

vince :
la structure du programme, y'a pas trop à y redire, par contre, l'utilisation de "setpixel" est suicidaire... cette fonction est très lente, car, elle crée un sprite, puis y met ton point, puis l'affiche... et le tout en 16 bits
en créant toi même les sprites au préalable et en te limitant à 8 bits (coordonnées entre 0 et 256) tu devrais facilement multiplier par 10 ou 20 la vitesse...

je suis en train de faire une nouvelle petite démo, et encore une fois j'aurai besoin d'utiliser des points à l'écran, mais beaucoup plus cette fois-ci.

Donc si j'ai bien compris, il faut que je fasse un sprite de 1x1 pixel, et pour me limiter à 8 bits c'est encore flou : les coordonnées entre 0 et 256 c'est pour l'écran? Comment je limite ça? un utilisant des uchar comme variables?
Previously known as Damdam

25

vince :
non
il faut absolument passer par la sprite engine la raison en est simple, le driver écran est inclus dans la sprite engine et n'est pas adressé.


question:
Pas possible de faire un sprite de la taille de l'écran et d'aller y taper ?

J'viens à peine de faire le rapprochement avc la jag qui fonctionne pareil: pas de memoire video mais juste une liste d'objets (sprites)

Allez ! Dites-moi que j'ai bon ?

26

oui t'as bon ^^
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

27

-

28

gol

tu fais un sprite unique dans ta liste... ayé t'as ton frame buffer...
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

29

Damdam
:
vince :
la structure du programme, y'a pas trop à y redire, par contre, l'utilisation de "setpixel" est suicidaire... cette fonction est très lente, car, elle crée un sprite, puis y met ton point, puis l'affiche... et le tout en 16 bits
en créant toi même les sprites au préalable et en te limitant à 8 bits (coordonnées entre 0 et 256) tu devrais facilement multiplier par 10 ou 20 la vitesse...

je suis en train de faire une nouvelle petite démo, et encore une fois j'aurai besoin d'utiliser des points à l'écran, mais beaucoup plus cette fois-ci.
Donc si j'ai bien compris, il faut que je fasse un sprite de 1x1 pixel, et pour me limiter à 8 bits c'est encore flou : les coordonnées entre 0 et 256 c'est pour l'écran? Comment je limite ça? un utilisant des uchar comme variables?
cts
:
vince :
non
il faut absolument passer par la sprite engine la raison en est simple, le driver écran est inclus dans la sprite engine et n'est pas adressé.


question:
Pas possible de faire un sprite de la taille de l'écran et d'aller y taper ?

J'viens à peine de faire le rapprochement avc la jag qui fonctionne pareil: pas de memoire video mais juste une liste d'objets (sprites)
Allez ! Dites-moi que j'ai bon ?
vince
: oui t'as bon ^^

Ça veut dire que c'est la méthode à utiliser pour moi? Créer un sprite de la taille de l'écran et écrire dedans? C'est ça limiter à 8 bits ? Désolé si je suis lourd avec ça, mais j'aimerai vraiment savoir comment pouvoir accélérer mes petits effets...
Previously known as Damdam

30

le mieux est de tester, mais bon pour ton starfield, je ne pense pas que tu auras mieux sans TOUT réécrire...
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