                                    LESý 

                               TUNNELS BITMAPý


Bon, je ne vais pas vous expliquer comme faire des tunnels
constitu‚s de polygones mapp‚s, mais simplement, les fameux
tunnels 2D si souvent vus et revus et bien plus facile …
programmer.ý

Le principe est simple, car tout est bas‚ sur des tables
pr‚calcul‚es. Vous aurez besoin de 2 tableaux de 64000 bytes si
vous voulez coder votre tunnel pour 320x200 pixels...il vous reste
encore la texture et l'‚cran virtuel, donc le tunnel + les tables
prendront environ 256k en m‚moire.ý

Maintenant, assumons que le premier tableau s'appelle T_ANGLES et
le second T_DEPTHS. Pour le premier tableau, il convient de faire
le calcul suivant :ý

ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ý
  t_angles[x,y]  = atan (y-ycentre / x-xcentre)ý
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙý

Xcentre et Ycentre vaudront respectivement 160 et 100 si vous ˆtes
en 320x200. Vous pouvez tout aussi bien utiliser ATAN2 :ý

ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ý
  t_angles[x,y]  = atan2 (x-xcentre , y-ycentre) ý
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙý
             
D'habitude, les valeurs retourn‚es sont exprim‚es en radians, pour
obtenir des d‚gres, vous devez proc‚der … la conversion suivante :
       
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ý
  t_angles[x,y]  = (atan (y-ycentre / x-xcentre))*255/3.14ý
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙý

Ici, le 255 correspond … la largeur de la texture (256x256), donc
… modifier en fonction de la taille de la texture.ý

Ensuite,le tableau des profondeurs T_DEPTHS, qui peut ˆtre calcul‚
comme ceci :ý
             
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ý
  valeur_sqrt    = sqrt((x-xcentre)^2 + (y-ycentre)^2)ý
  t_depths[x,y]  = (radius_tunnel * distance) / valeur_sqrtý
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙý

Pour le radius du tunnel et la distance, prenez des puissances de
2 afin d'acc‚l‚rer les calculs. De bonnes valeurs, sont 256 pour
la distance et 64 pour le radius. ý

Pour r‚sumer, voici la boucle des pr‚calculations :ý
        
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ý
        largeur_ecran = 320ý
        hauteur_ecran = 200ý

        xcentre = largeur_ecran / 2ý
        ycentre = hauteur_ecran / 2ý

  for   y = 1 to hauteur_ecran - 1ý
  {ý
        for x = 0 to largeur_ecran - 1 ý
        {ý
        t_angles[x,y] = (atan (y-ycentre / x-xcentre))*255/3.14ý
        valeur_sqrt   = sqrt((x-xcentre)^2 + (y-ycentre)^2)ý
        t_depths[x,y] = (radius_tunnel * distance) / valeur_sqrtý
        }ý
  }ý
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙý

Il ne reste plus qu'… afficher le tunnel sur l'‚cran en se
r‚f‚rant aux tables d'angles et profondeurs :ý

ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ý
  x_texture  = t_angles[x,y] + deplacement_xý
  y_texture  = t_depths[x,y] + deplacement_yý
  ecran[x,y] = texture[x_texture,y_texture]ý
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙý

Les variables "deplacement_x" et "deplacement_y" permettent de
faire tourner le tunnel et de le faire avancer. A chaque nouvelle
frame, il convient d'augmenter ou de diminuer ces valeurs. La
texture fait en g‚n‚ral 256x256 pixels.ý

Cependant, il est parfois n‚cessaire de r‚cr‚er les tables
"directement dans le code", pour les intros 4k ou 64k, o— des
tables pr‚calcul‚es de 64k sont trop larges pour tenir dans
l'ex‚cutable final. Les programmeurs en C ou en PASCAL n'ont pas
ce problŠme car la fonction ATAN existe, mais ceux qui veulent
programmer cela en ASM, ne disposent pas de telles fonctions
trigonom‚triques.ý

On peut trouver l'ATAN d'un nombre comme celaý
                                       (merci Eclipse/Knights ;):ý

f(x)= (Pi*(2+3*x+3*x^2+2*x^3)+1/3*(-19-3*x+3*x^2+19*x^3)) /ý 
      (4*(x+1)*(2*x^2+x+2))ý

Cela retourne une valeur en degr‚s pour les nombres positifs, si
vous avez besoin l'ATAN d'un nombre n‚gatif, il suffit de changer
f(x) en -f(-x).ý

Pour les racines, il existe de nombreuses sources pour les
calculer, voici quand meme une routine (trouv‚e dans les
librairies livr‚es avec l'extender DOS32 - Adam Seychell) :ý

ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ý
  ; entr‚e : EAX = nombre dont on cherche la racine carr‚eý
  ; sortie : EAX = racine carr‚e du nombreý

  SQRT    Proc ý
  mov     edi,eaxý
  bsr     ecx,edi             ; ca ne tournera que sur 486 et +ý
  shr     cl,1 ý
  mov     ebp,ediý
  shr     ebp,clý

 calc_sqrt_Loop:ý
 push    ebpý
 mov     ebx,ebpý
 shl     ebx,1ý
 mov     eax,ebpý
 mul     ebpý
 sub     eax,ediý           
 sbb     edx,0ý             
 idiv    ebxý            
 sub     ebp,eaxý          
 pop     eaxý             
 cmp     ebp,eaxý         
 jne     calc_sqrt_Loopý
 mov     eax,ebpý     
 retý
 SQRT    Endpý
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙý

Voila, avec ca, vous devriez pouvoir programmer de jolis tunnels
bitmap. Vous verrez qu'en modifiant certains paramŠtres, on peut
obtenir des effets trŠs int‚ressants (cf. Television/Coma). :))ý
J'espŠre que c'est pas trop "fouilli" comme c'est bien souvent le
cas avec les docs ;)))ý
                                

                                     - DaKe / CaLoDoX -ý
                                     = dake@omedia.ch =ý
                            ÿð http://www.omedia.ch/pages/dake/ ðý
