Ce chapitre constitue une suite du Chapitre XII concernant les sprites en noir et blanc. Il est donc impératif que vous l'ayez lu, et surtout, compris.
    Il est aussi nécessaire que vous ayez lu et compris le Chapitre XIV concernant les graphismes de base en niveaux de gris.
    En effet, ce chapitre va nous permettre de "mêler" des instructions de ces deux chapitres, afin de créer des sprites en niveaux de gris. (4 pour être plus précis, puisque TIGCC ne nous permet pas d'utiliser la méthode des 7 niveaux de gris, qui ne fonctionne pas de façon correcte sur HW2).
    Si vous souhaitez avoir des précisions concernant la façon dont les niveaux de gris fonctionnent sur nos TIs, je vous conseille de lire cette page, qui est consacrée à ce sujet.

 

I:\ Fonctionnement des Sprites en niveaux de gris :

    Pour afficher des Sprites en niveaux de gris, il faut, tout comme pour les autres types de graphismes en niveaux de gris, utiliser deux plans à tour de rôle...

    Nous allons, pour illustrer ceci, étudier l'exemple d'un sprite, de la même façon que nous l'avons fait au Chapitre XII, dans la partie définition manuelle...

Sprite en niveaux de gris...

   1: LIGHT _PLANE :

Sprite en niveaux de gris... LIGHT_PLANE

    Ensuite, il s'agit de transformer ce dessin en une liste de nombres hexadécimaux. (Je vous invite à lire le Chapitre XII pour plus de détails à ce sujet !).
    On obtiendra ici :
        static unsigned short sprite_light[] = {0xFFFF, 0x8181, 0x8181,0x8181, 0x8181, 0x8181, 0x8181, 0xFE7F, 0xFE7F, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0xFFFF};

 

   2: DARK_PLANE :

Sprite en niveaux de gris... DARK_PLANE

    Ensuite, il s'agit de transformer ce dessin en une liste de nombres hexadécimaux. (Je vous invite à lire le Chapitre XII pour plus de détails à ce sujet !).
    On obtiendra ici :
        static unsigned short sprite_dark[] = {0xFFFF, 0xC003, 0xA005, 0x9009, 0x8811, 0x8421, 0x8241, 0x8181, 0x8181, 0x8241, 0x8421, 0x8811, 0x9009, 0xA005, 0xC003, 0xFFFF};

 

II:\ Affichage du sprite en niveaux de gris :

    Pour afficher un sprite en 4 niveaux de gris, il convient d'utiliser le schéma suivant :

    Pour vous permettre de mieux comprendre comment fonctionne cet affichage, je vous propose d'étudier l'exemple suivant. Il s'agit d'une "reprise" de celui que nous avons étudié au  Chapitre XII, sauf que, cette fois-ci, le sprite que nous animerons est en niveau de gris au lieu d'être en noir et blanc.

#define OPTIMIZE_ROM_CALLS
#define SAVE_SCREEN
#include <tigcclib.h>

short _ti92plus;

void _main(void)
{

  static unsigned short sprite_dark[] = {0xFFFF, 0xC003, 0xA005, 0x9009, 0x8811, 0x8421, 0x8241, 0x8181, 0x8181, 0x8241, 0x8421, 0x8811, 0x9009, 0xA005, 0xC003, 0xFFFF};
  static unsigned short sprite_light[] = {0xFFFF, 0x8181, 0x8181,0x8181, 0x8181, 0x8181, 0x8181, 0xFE7F, 0xFE7F, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0x8181, 0xFFFF};
// Déclaration des listes correspondant aux deux plans du sprite.

 
short key=0;
// Crée la variable de touche pressée au clavier.
 
short xxa=0;
// Crée la variable de position selon x.
 
short yya=0;
// Crée la variable de positon selon y.

  GrayOn();
  SetPlane(LIGHT_PLANE);
  ClrScr();
  SetPlane(DARK_PLANE);
  ClrScr();

  xxa=0, yya=0;
// Place la valeur 0 dans les variables de position.
  ClrScr();
// Efface l'écran.

 
do
  {

   
if(key!=0)
    {
     
Sprite16(xxa, yya, 16, sprite_light, GetPlane(LIGHT_PLANE), SPRT_XOR);
     
Sprite16(xxa, yya, 16, sprite_dark, GetPlane(DARK_PLANE), SPRT_XOR);
    }
/* Pour que le sprite ne soit pas effacé la première fois.
(quand aucune touche n'a été pressée.)*/

    switch(key)
    {                            
// Boucle qui examine la valeur de "key".
     
case 340:               // Si key vaut 340 (touche droite a été pressée).
     
if(xxa+16 < 240)     // Pour que le texte ne sorte pas de l'écran.
        xxa= xxa+2;            // Déplace le texte de 5 pixels vers la droite.
     
break;                   // Fin de ce cas.

     
case 337:              // Si key vaut 337 (touche gauche a été pressée).
     
if(xxa > 0)              // Pour que le texte ne sorte pas de l'écran.
        xxa = xxa-2;            // Déplace le texte de 5 pixels vers la gauche.
     
break;                  // Fin de ce cas.

     
case 344:             // Si key vaut 344 (touche bas a été pressée).
     
if(yya+16 < 128)   // Pour que le texte ne sorte pas de l'écran.
        yya = yya+2;          // Déplace le texte de 5 pixels vers le bas.
     
break;                 // Fin de ce cas.

     
case 338:            // Si key vaut 338 (touche haut a été pressée).
     
if(yya > 0)            // Pour que le texte ne sorte pas de l'écran.
        yya = yya-2;          // Déplace le texte de 5 pixels vers le haut.
     
break;                // Fin de ce cas.

   
}                        // Fin de cette boucle "switch()";

   
Sprite16(xxa, yya, 16, sprite_light, GetPlane(LIGHT_PLANE), SPRT_XOR);
   
Sprite16(xxa, yya, 16, sprite_dark, GetPlane(DARK_PLANE), SPRT_XOR);
// Pour dessiner le sprite à la nouvelle position.

    key = ngetchx();
// Attend qu'une touche soit pressée, et stocke sa valeur dans key.

 
}                      // Fin de la boucle "do{}".
  while(key != 264); 
// Tout ce qui a été décrit précédemment est valable jusqu'à ce qu'on appuie sur ESC.

  GrayOff();
  ClrScr();         // Efface l'écran
  DlgMessage("Au revoir !", "En espérant être utile... squale92@wanadoo.fr www.multimania.com/squale92", BT_NONE, BT_NONE);
// Affiche une boite de dialogue donnant mon adresse et celle du site où vous avez trouvé ce tutorial.

}

    J'espère que cet exemple vous a permis de comprendre les bases du fonctionnement des sprites en niveaux de gris...
    Avant de passer au chapitre suivant, il faut que vous sachiez que, ici, nous n'avons étudié que la technique de dessin de sprites en mode non-masqué, mais vous pouvez aussi choisir des les dessiner en mode masqué...

 

Chapitre XVI


Copyright Squale92 & Verstand. Logo et sigle TCI® réservés. Développé pour MS Internet Explorer 5.0 en 1024x768 pixels. Page modifiée le