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.