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 ]