Petit exercice commenté pour suivre : afficher et déplacer un sprite à l'écran.
Pour celà, il faut un fond d'écran et un sprite plus petit (utilisant la même palette vu que les 2 seront affichés à l'écran simultanément).
La génération/gestion d'un sprite se fait de la même manière qu'un fond d'écran, à quelques nuances prêt :
SPRPCK -t6 -S016032 -p0 sprite.bmp
Dans cet exemple, je pars du principe que le sprite fait 32 pixels de haut et 16 pixels de large, si le votre est différent, adaptez la valeur -S016032
De plus, je pars du principe qu'il est en haut à gauche du fichier bmp (on verra une autre fois comment marche SPRPCK en détail)
Si votre sprite n'est pas rectangulaire, vous souhaiterez qu'il y ait un effet de transparence (c'est à dire qu'on voit le fond derrière le sprite là ou il n'y a rien, par exemple, qu'une balle soit ronde, par un cercle sur un carré, on illustrera plus tard). Bref, le fond doit être la couleur 0 de la palette, c'est important.
Une fois les 2 objets générés, seul le fichier .pal du fond sera utile (vu que les 2 sont les mêmes), par contre, copiez les 2 fichiers .obj dans le répertoire OBJ et générez la librairie.
Au niveau du programme, reprenez celui donné en page 1 (affichage d'une seule image).
Vous allez devoir le modifier de la façon suivante :
- déclarer le sprite (de la même manière que vous déclarez les images supplémentaires dans le slide-show)
- déclarer un nouveau controleur de sprite pour le sprite.
Qu'est ce qu'un controleur de sprite, c'est ce qui correspond à ce bout de code :
extern char SCBs[];
#asm
_SCBs 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
La déclaration se fait en 2 temps. Tout d'abord, en C, déclarer l'objet (ici SCBs), puis en assembleur, l'initialiser.
Vous noterez la valeur $c7 dans la première ligne de type dc.b, je reviendrais dessus un peu plus tard.
Ensuite, dans le programme principal, qui ressemblait à :
char main()
{
InitIRQ();
CLI;
SetBuffers(SCREEN, RENDER ,0);
/* set the palette */
SetRGB(pal);
DrawFBox(0,0,160,102,0);
SCBX(SCB) = 0;
SCBY(SCB) = 0;
SCBDATA(SCB) = fond;
DrawSprite(SCB);
Vsync();
SwapBuffers();
for( ; ; );
}
On va ajouter l'initialisation de notre sprite :
SCBX(SCBs) = 50;
SCBY(SCBs) = 50;
SCBDATA(SCBs) = sprite;
SCBX() et SCBY() servent à définir les coordonnées X & Y de l'objet à l'écran, ici, on le place en (50,50).
SCBDATA() sert à associer un objet au controleur de sprite
On va mettre l'affichage du tout (d'abord le fond, puis le sprite) dans une boucle infinie :
for( ; ; )
{
DrawSprite(SCB);
DrawSprite(SCBs);
Vsync();
SwapBuffers();
}
Arrivé là, on affiche le sprite par dessus le fond.
Pour déplacer notre sprite, on va utiliser 2 variables x et y (à déclarer en type int au début du programm), et les gérer au joystick :
la variable joystick est un octet ou chaque bit correspond à une valeur du pad (direction enfoncée oui/non, bouton enfoncé oui/non)
Pour des raisons de facilité, on avait déclarer ce bloc au début du programme :
/* 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
Donc, pour sire que si on va à droite, on incrémente x, on tape le bloc suivant :
if (joystick & JOY_RIGHT)
x++;
le & signifie qu'on fait un test binaire entre joystick et JOY_RIGHT, si ça marche, ça veut dire que la direction droite est enfoncée.
Il faut ensuite, grâce à SCBX() changer la position du sprite à l'acran.
On a donc un corps de programme principal qui ressemble à ceci :
char main()
{
InitIRQ();
CLI;
SetBuffers(SCREEN, RENDER ,0);
/* set the palette */
SetRGB(pal);
DrawFBox(0,0,160,102,0);
SCBX(SCB) = 0;
SCBY(SCB) = 0;
SCBDATA(SCB) = fond;
SCBX(SCBs) = 0;
SCBY(SCBs) = 0;
SCBDATA(SCBs) = sprite;
x = 50;
y = 50;
for( ; ; )
{
DrawSprite(SCB);
if (joystick & JOY_RIGHT)
x++;
SCBX(SCBs) = x;
SCBY(SCBs) = y;
DrawSprite(SCBs);
Vsync();
SwapBuffers();
}
}
2 petites choses :
- seule la direction à droite est gérée, je vous laisse gérer la gauche, le haut et le bas,
- il n'y a pas de test de sortie d'écran, à vous de l'ajouter si vous voulez.
Revenons un instant sur le fameux $c7
C'est ce qui indique que le controleur de sprite affichera l'objet en mode transparent (rappelez vous la balle).
Si vous voulez voir la différence, remplacer ce $c7 par $c0 (comme le fond).
Bon exercice.
Si vous voulez, vous pouvez essayer d'afficher plus de sprites, voire de les controller par la console (aller/retour à la space invaders par exemple).