vince Le 02/07/2003 à 10:27 bah pareil quoi...
#include <lynx.h>
#include <lynxlib.h>
#include <stdlib.h>
// SPRDEMO3
// Démo pour montrer des sprites de 24*24 avec un centre à 12,12
// et tout ce petit monde partage la même palette
// ----------------------------------------------------------------------
//
// Créez les 9 sprites avec SPRPCK :
// sprpck -t6 -S024024 -r009001 -p0 -a012012 mm.bmp
//
// -t6 --> BMP
// -Swwwhhh --> 24*24
// -rxxxyyy --> 9images en 1 ligne
// -p0 --> sortie en .OBJ
// yx.bmp --> nom du fichier
//
// la palette est standard, 4 couleurs...
// déclaration des 9 sprites:
extern char mm000000[];
extern char mm000001[];
extern char mm000002[];
extern char mm000003[];
extern char mm000004[];
extern char mm000005[];
extern char mm000006[];
extern char mm000007[];
extern char mm000008[];
char *sprtab[9] = {mm000000, mm000001, mm000002, mm000003,
mm000004, mm000005, mm000006, mm000007,
mm000008};
extern char SCB1[];
#asm
_SCB1 dc.b $c0,$10,$20
dc.w 0,0
dc.w 0,0,$200,$200 ; zoom= x2
dc.b $01,$23,$45,$67,$89,$Ab,$cd,$ef
#endasm
// la palette
#include "mm.pal"
// Tableau des valeurs de retournement pour les sprites (on a 9 sprite pour 90° et 4 modificateur rotation/inversion qui permentent d'obtenir 36 positions soit une tous les 10°)
hvflip[4] = {0xc0, 0xd0, 0xf0, 0xe0};
//définition des constantes des touches
#define JOY_RIGHT 0x10
#define JOY_LEFT 0x20
#define JOY_UP 0x80
#define JOY_DOWN 0x40
#define BUTTON_OPTION1 0x08
#define BUTTON_OPTION2 0x04
#define BUTTON_LEFT 0x02
#define BUTTON_RIGHT 0x01
#define BUTTON_PAUSE 0x01
uchar VBLflag at 0xff;
//incrémentation du flag, on boucle ensuite jusqu'à ce que l'IT le ramène à 0)
#define VSYNC {++VBLflag;while( VBLflag );}
VBL() interrupt
{
IRQ_ENTRY();
VBLflag = 0; /* L'IT VBL vient d'intervenir, le flag est mis à 0 */
IRQ_EXIT();
}
/*****************************/
/* Pause de durée variable */
/*****************************/
WaitTicks(waitticks)
uchar waitticks;
{
uchar tick;
tick = 0;
while (tick < waitticks) //tant qu'on a pas atteint notre compteur de ticks
{
VSYNC; //on attends une synchro verticale de l'écran
++tick; //on incrémente
}
}
/**********************************************/
/* idem à wait button sur les autres exemples */
/* sauf qu'il renvoie la touche */
/**********************************************/
uchar GetButton()
{
uchar key;
while ( !(key = joystick))
;
return key;
}
/*********************/
/* main */
/*********************/
main()
{
register uchar t, key;
InitIRQ(); // initialisation des vecteurs d'irq
InstallIRQ(2,VBL); // on init l'interruption VBL
EnableIRQ(2); // on autorise son fonctionnement
CLI;
SetBuffers(0x9000,0,0); // déclaration du buffer d'écran
_SetRGB(pal); // Set the colour palette
DrawFBox(0, 0, 160, 102, 4); // Colour 4 is dark gray
SCBX(SCB1) = 80; // milieu de l'écran X
SCBY(SCB1) = 51; // " " " Y
t=0; // t est la valeur courante de l'angle exprimée en dizaine de degrés (t=12 <=> angle= 120°)
for (;;)
{
WaitTicks(5); // Pause ( 5 VSYNCs )
SCB1[0] = hvflip[t/9]; // Determine le quart de 360° dans lequel on se trouve
if ((t/9) == 0 || (t/9) == 2)
SCBDATA(SCB1) = sprtab[t%9]; // ordre normal pour le quart 0 et 2
else
SCBDATA(SCB1) = sprtab[8-(t%9)]; // ordre inverse pour 1 et 3
DrawSprite(SCB1); affichage
// Get user input
key = GetButton(); // teste la touche
if (key == BUTTON_OPTION1) // si option1 est enfoncé
{
DrawFBox(0, 0, 160, 102, 4); // Gris foncé
SCBHS(SCB1) = 0x100; // zoomH= x1
SCBVS(SCB1) = 0x100; // zoomV= x1
}
if (key == BUTTON_OPTION2) // si option2 est enfoncé
{
DrawFBox(0, 0, 160, 102, 4);
SCBHS(SCB1) = 0x200; // zoomH= x2
SCBVS(SCB1) = 0x200; // zoomV= x2
}
if (key & (BUTTON_LEFT | JOY_LEFT))
{
if (t==0) t = 4*9; //si t=0 on met t on fait +2pi
--t; //on décrémente t
}
if (key & (BUTTON_RIGHT | JOY_RIGHT))
{
if (t==4*9-1) t = -1; // si t= 2pi-10°, on enlève 2pi
++t; //on incrémente t
}
} // jusqu'à la ce que sinus(X) soit égal à 2 :)
}
