La Technique du Feu !




                                                     Par Supernova


PRINCIPE:
---------

Dernièrement, la mode des effets dans les demos était aux flammes.
Voici  enfin revelée en exclusivité pour les lecteurs de TOXIC MAG
la fameuse technique de programmation de ce magnifique effet.

En  fait, comme toujours, il n'y a rien de compliqué.  Le tout est
de bien observer l'effet pour en tirer un algorithme. Le premier à
l'avoir fait avec succès fut un codeur espagnol de je ne sais plus
quel pseudo.

Il  avait  remarqué que plus on s'éloigne du foyer du feu, plus la
flamme est foncée, tout en gardant le même motif.  La couleur d'un
point de la flamme (si on la décompose en une multitude de points)
dépend de la couleur des points qui se trouvent en dessous de lui.
Il était donc arrivé à la conclusion que pour calculer la couleur,
la formule idéale serait :

C(x,y)=(C(x-1,Y+1)+C(X,Y+1)+C(X+1,Y+1)+(X,Y+2))/4

                ¦  X  ¦ <- couleur a calculer
                ¦  Y  ¦
          ------+-----+------
           X-1  ¦  X  ¦ X+1
           Y+1  ¦ Y+1 ¦ Y+1
          ------+-----+-----
                ¦  X  ¦
                ¦ Y+2 ¦

Il  faut  bien générer des couleurs à la base, car si on part d'un
écran  noir,  la  moyenne des points, donnera 0 à n'importe quelle
position.

Pour  créer un foyer, on va donc afficher des points de couleur la
plus vive à des positions aléatoires en bas d'écran. Notre palette
sera  donc  un degradé du jaune au rouge foncé.  Plus on monte, et
plus les points sont foncés.


PROBLEMES:
----------

Reste  un problème : notre ST dispose de 16 couleurs.  On  se rend
compte que l'on est vite limité par la hauteur des flammes avec si
peu  de couleur.  Il faut donc pouvoir "étendre" chaque couleur de
la palette pour simuler une très grand nombre de couleurs.

Ok, ce problème est résolu. Mais maintenant un autre problème : i-
maginons  que  la couleur d'un point calculée soit 48 (avec 4 pour
correspondance dans la palette réelle).  Comment afficher un point
de couleur 48 ?  Et puis, comment garder cette valeur pour le pro-
chain calcul ? Une routine lecture de couleur d'un point à l'écran
renverra  de  toute  façon toujours une valeur comprise entre 1 et
16...


SOLUTIONS:
----------

On va donc effectuer tous nos calcul sur un écran virtuel. En fait
ce  sera  un tableau à deux dimensions utilisé.  Avec, dans chaque
case  de  ce tableau, la couleur "étendue" du point correspondant.
On  peut donc travailler avec des valeurs de couleur supérieures à
16  et convertir celles ci (par une division correspondant au RAP-
PORT) pour affichage des vraies couleurs à l'écran. Ceci nous per-
mettra  d'avoir des dégradés plus diffus et des flammes plus éten-
dues.

On apelle donc notre tableau "MATRICE". On peut décider de la lar-
geur  et  la hauteur de ce tableau.  Si on veut un écran de 64 sur
80, on aura matrice (64,80).

Notre  routine va donc créer un foyer.  Pour cela on remplit de la
valeur  la plus grande (16*rapport) aléatoirement les X de la der-
nière ligne de notre tableau.  Si l'on veut des flamme larges à la
base,  on ne mettra pas qu'un seul point à 1 mais par exemple, les
4  consécutifs.  C'est la variable WIDE qui indique la largeur des
barettes ainsi générées.

Ensuite, on scanne le tableau de haut en bas en appliquant la for-
mule à chaque point.  On oublie pas de stocker chaque nouvelle va-
leur dans la case du tableau.

On  divise  cette  valeur par le rapport pour obtenir un numéro de
couleur dans la palette.

On affiche ce point.

On efface la dernière ligne du tableau pour recommencer un nouveau
foyer. En effet, si on ne le faisait pas, le feu grandirait conti-
nuellement  de la même couleur.  Il  faut pouvoir créer des "trous
noir" de temps en temps...


L'ALGORITHME:
-------------

RAPPORT=2
LARGEUR=64
HAUTEUR=80
MATRICE(LARGEUR,HAUTEUR)
WIDE=2    *la base des flammes fait 2 pixel

REPETER
 * CREATION DU FOYER
 POUR I DE 1 A 4
  X=RANDOM(LARGEUR)
  POUR J DE 1 A WIDE
   MATRICE(LARGEUR+J,HAUTEUR)=16*RAPPORT
  FINPOUR
 FIN POUR

 *scannage de l'écran virtuel
 POUR Y DE 1 A HAUTEUR
  POUR X DE 1 A LARGEUR
   * la fameuse formule
   C=(MATRICE(X-1,Y+1)+MATRICE(X,Y+1)+MATRICE(X+1,Y+1)+MATRICE(X,Y+2))/4
   * stocke nouvelle valeur
   MATRICE(X,Y)=C
   * on affiche le point avec la vraie couleur
   POINT X,Y,C/RAPPORT
  FINPOUR
 FINPOUR

 * on efface l'ancien foyer
 POUR X DE 1 A LARGEUR
  MATRICE(X,HAUTEUR)=0
 FINPOUR

JUSQU'A L'INFINI


ROUTINE ASSEMBLEUR:
-------------------

Bon,  je suppose que vous connaissez déjà l'assembleur.  De toutes
façons,  avec l'algorithme donné, on peut écrire le programme dans
n'importe quel langage.

Quelques remarques cependant:

- la  routine ASM a sa propre routine de points (on ne va pas s'é-
  taler dessus...)
- n'étant pas optimisé on peut arriver à afficher un feu de 40*40.
  Sans  ralentissement, on arrive péniblement à 64*64.  Et au des-
  sus, on voit trop l'effet de scannage.
- le source est commenté.


CONCLUSION:
-----------

A  peu  de  frais, et même sur un ST, on peut arriver facilement à
faire  une routine de flamme.  Sur PC, à titre d'exemple, les mecs
utilisent  les  256  couleurs et ont des trucs pédalant à 120 Mhz,
pour dire s'ils ont pas besoin de se casser le cul avec des matri-
ces, en lisant directement la couleur d'un point à l'écran, et ar-
rivent à faire des feux de 120*120 les doigts dans le nez. Mais je
suis  sur  qu'en  optimisant  un peu cette routine, on arrive sans
trop de mal à des feux de 80*80.  Comme amélioration, j'ai mis une
recopie  aléatoire  de  bloc au blitter, ce qui nous donne un beau
feu de 200*64 sans aucun ralentissement. Je la mettrai le prochain
coup si ça vous intéresse, car là, ça sort de notre article.

Voilà, vous trouverez normalement sur le disk :

- L'article,
- Le source ASM commenté,
- Des exécutables correspondant à différentes tailles de feu.

Allez,  il  est  temps de vous laisser, mais avant de partir, j'en
profite que je suis au clavier pour raconter deux trois truc, avec
la  permission  de la rédaction du TOXIC MAG (au fait les mecs, si
vous voulez mettre ce baratin dans une autre rubrique, ne vous gê-
nez  surtout  pas...  c'est juste que j'ai un peu de temps a tuer,
alors hop! ;-)

[NdTB : plutôt deux fois qu'une ! Si vous voulez lire le "baratin"
de Supernova, il suffit d'aller voir la rubrique libre expression,
une toute nouvelle rubrique inaugurée dans ce numéro...  Donc j'ai
mis  ce que Supernova avait à dire dedans (dans la catégorie "coup
de gueule")... A tout de suite !]



[ Retour au sommaire ]