Précédent : Index Up : Index Suivant : Utilisation

Introduction

Cette partie a pour but de présenter le fonctionnement général de la librairie.

La librairie est adaptée aux jeux nécessitant un arrière-plan de grande taille (en tout cas, plus large que l'écran d'une TI92+), et que l'on doit déplacer avec une précision au pixel près.

Pour cela voici le procédé utilisé : le plan (la map, le niveau), est représenté par un tableau à deux dimensions, une case représente un carré de 16x16 pixels (ou 8x8 selon les cas), elle correspond donc à un sprite de cette même taille. Chaque case devra donc contenir le numéro du sprite correspondant, et tous les sprites seront alors rangés dans une liste de sprites (afin de pouvoir y accéder à partir de leur numéro).
Cette méthode présente un premier avantage : on peut utiliser un même sprite plusieurs fois dans le niveau, et on obtient ainsi un gain important de place puisque le sprite n'est défini qu'une seule fois, et partout où il est utilisé, on ne le référence que par son numéro, qui prendra 1 ou 2 octets selon que l'on utilisera une matrice d'octets ou de word, au lieu de 8 ou 32 selon que l'on utilisera des sprites 8x8 ou 16x16.
Ensuite, pour afficher le plan à l'écran, il faut passer par deux étapes : d'abord, on recopie grossièrement la zone du plan que l'on veut afficher dans un écran virtuel plus large que l'écran réel (32 pixels de plus en hauteur et en largeur pour être précis, ce qui fait que cet écran virtuel aura une taille de (240+32)*(128+32)/8 = 5440 octets).
Et enfin, on affiche ce grand écran virtuel à l'écran, en décalant en même temps l'image pour obtenir la zone exacte que l'on veut afficher.
Cela peut paraître peu subtil d'utiliser un plan intermédiaire, mais c'est en réalité très avantageux car on n'est pas obligé de rafraichir le contenu du grand écran virtuel à chaque image, on le fait seulement lorsque c'est nécessaire, c'est-à-dire lorsque l'on veut animer des tiles (3 à 4 fois par secondes en général, c'est-à-dire une image sur 5-6 pour un jeu à 20 fps) ou lorsque l'on dépasse les limites du grand écran virtuel (il n'a que 32 pixels de plus que l'écran normal, donc il faut rafraichir le buffer 1 fois sur 32 pour un jeu avec un déplacement de 1 pixel par image).
Cela permet à la fonction qui recopie cet écran virtuel plus grand vers l'écran de taille normale d'être très optimisée pour faire précisément cette tâche plutôt que de devoir s'adapter à une taille quelconque. Cette fonction est donc appelée à chaque image et est très rapide.

Voici un shéma pour vous aider à visualiser le principe de fonctionnement :
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|00|00|00|00|00|00|00|00|01|01|01|00|00|00|00|00|00|00|00|00|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|00|00|00|00|00|00|01|01|01|01|01|01|00|00|00|00|00|00|00|00|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|00|00|00|00|00|01|01|01|01|01|01|01|01|01|01|00|00|00|00|00|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|00|00|00|00|00|01|01|01|01|00|00|01|01|01|01|01|00|00|00|00|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|00|00|00|00|01|01|01|01|00|00|00|01|01|01|01|00|00|00|00|00|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|00|00|00|00|01|01|01|01|01|01|00|01|01|01|00|00|00|00|00|00|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|00|00|00|00|00|01|01|01|01|01|01|01|01|01|01|01|00|00|00|00|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|00|00|00|00|00|00|00|00|01|01|01|01|01|01|01|01|01|01|00|00|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|00|00|00|00|00|00|00|00|01|01|01|01|01|01|01|01|01|01|01|00|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|00|00|00|00|00|00|00|00|00|01|01|01|01|01|01|01|01|00|00|00|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|00|00|00|00|00|00|00|00|00|00|00|01|01|01|01|00|00|00|00|00|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|00|00|00|00|00|00|00|00|00|00|00|00|01|00|00|00|00|00|00|00|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Voici notre plan, en rouge est représentée la zone que l'on désire afficher. Dans cet exemple, seuls deux sprites différents sont utilisés, le sprite n°1 est mis en gras pour une meilleure visibilité. Ce plan pourrait être utilisé dans un RPG, pour représenter par exemple une île entourée d'eau, avec un lac au centre (le sprite 0 serait de l'eau et le sprite 1 serait de la terre).
Chaque case représente un sprite de 16x16 pixels.
On peut déjà noter que la zone rouge fait 272x160 pixels, c'est-à-dire (240+32)x(128+32), donc en réalité, on n'affichera pas la totalité de la zone rouge à l'écran, mais seulement une partie.

La zone rouge est entièrement copiée dans le grand écran virtuel (en remplaçant, bien sûr, les numéros par leur sprite correspondant).
Voici donc ce qu'on obtient sur le grand écran virtuel :
              272
     <----------------->
   ^ +-----------------+
   | |    ######       |
   | |   ##########    |
   | |   ####  #####   |
   | |  ####   ####    |
160| |  ###### ###     |
   | |   ###########   |
   | |      ########## |
   | |      ###########|
   | |       ########  |
   | |         ####    |
   v +-----------------+
Les sprites n°1 seront représentés par '#', et les sprites n°0 par ' '.
Il ne reste plus maintenant qu'à afficher la partie de cet écran virtuel que l'on souhaite voir, dans le vrai écran (de 240x128 pixels).
La précision de mes shémas ne me permet plus de dessiner cette dernière phase, je vais donc ne dessiner qu'une partie de l'écran de taille normale.
Supposons que l'on veuille par exemple, afficher la zone commençant aux coordonnées 35 en abscisse et 21 en ordonnée.
On a pour cela dessiné dans le grand écran virtuel la zone de la map commençant aux coordonnées (32 ; 0). Il faut donc afficher le contenu du grand écran virtuel à partir de son 4ème pixel en abscisse et de son 22ème en ordonnée.
Le résultat sur l'écran de taille normale ressemblera à ça :
            16
    <---------------->
  ^ +----------------+----------------+----------------+---------------
  | |             |  |           ^ |  |             |  |             | 
  | |             |  |           | |  |             |  |             | 
  | |             |  |         11| |  |             |  |             | 
16| |      13     |  |           | |  |             |  |             | 
  | |<----------->|  |           v |  |             |  |             | 
  | |-------------+--|-------------+--|-------------+--|-------------+-
  | |             |  |             |  |             |  |             | 
  | |             |  |             |  |             |  |             | 
  v +----------------+----------------+----------------+---------------
    |             |  |             |  |             |  |             | 
    |             |  |             |  |             |  |             | 
    |             |  |             |  |             |  |             | 
    |             |  |             |  |             |  |             | 
    |             |  |             |  |             |  |             | 
    |-------------+--|-------------+--|-------------+--|-------------+-
    |             |  |             |  |             |  |             | 
    |             |  |             |  |             |  |             | 
    +----------------+----------------+----------------+---------------
    |             |  |             |  |             |  |             | 
    |             |  |             |  |             |  |             | 
    |             |  |             |  |             |  |             | 
    |             |  |             |  |             |  |             | 
    |             |  |             |  |             |  |             | 
    |-------------+--|-------------+--|-------------+--|-------------+-
    |             |  |             |  |             |  |             | 
Je n'ai représenté qu'une partie de l'écran (en noir). En gris clair, j'ai représenté le grand écran virtuel : en fait, ce sont les limites entre les cases 16x16.


Précédent : Index Up : Index Suivant : Utilisation