require("../../global.php");
entete();
?>
L'EFFET
DE FLAMMES
I. La palette utilisée
Rappel : Pour définir une
couleur,
entrez son numéro (entre 0 et 255) au port 03C8h. Puis entrez les composantes rouge,
vert, bleu, dans cet ordre, au port 03C9h.
II. La technique de l'effet de flamme
1. Et on plante le décor
On se servira de deux tampons mémoire
d'une taille de 64960. Ils représenteront deux écrans virtuels
d'une taille de 320 x 203. Ces tampons serviront pour les calculs intermédiaires
(on calcule d'abord l'écran dans un buffer puis on copie ensuite
ce buffer vers la mémoire écran où il deviendra visible).
Etant donné leur taille, on se servira de pointeurs qui renverront
sur ces tableaux. La déclaration des types pourra donc se faire
ainsi en pascal (cela ne pose pas de problème à traduire en C) :
Type TBuffer = Array [0..64959] of Byte ;
PBuffer = ^TBuffer ;
Nos deux buffers d'écran, Buff1 et Buff2
seront alors déclarés de type PBuffer. De plus, pour stocker
une valeur de couleur dans un des tableaux, on écrira (en pascal
toujours) :
Buff1^[offset] := ...
Remarque : pour
calculer l'offset d'un point dans le tableau à partir de ses
coordonnées, il faut utiliser la formule :
offset
= Largueur de l'écran * y + x
d'où
ici :
offset := 320*y+x;
Au début de notre programme, il va falloir allouer la mémoire
correspondant aux buffers par la commande :
GetMem(Buff1,64960) ;
On
n'oubliera pas de libérer la mémoire allouée en fin
de programme, par la commande :
FreeMem(Buff1,64960) ;
2. Et on met en place l'algorithme
Pour commencer, on initialise les deux
buffers à la couleur 0. On va maintenant travailler dans Buff1^.
On remplit les 3 dernières lignes (200 à 202) avec des couleurs
aléatoires comprises entre 0 et 31. De plus, on place un certain
nombre de foyers (environ 40) de 3x3 pixels et de couleur blanche (255),
situés quelque part sur les 3 dernières lignes. On peut alors
attaquer le calcul proprement dit des flammes.
La zone à calculer ne sera pas Buff1^
en entier : en raison de l'interpolation, on ne calculera que les pixels
avec x appartenant à [1..318] et y appartenant à [1..201].
Pour chaque point (x, y) de la zone précédente, on effectue
les opérations suivantes :
-
On calcule la somme des couleurs des 8 points
adjacents.
-
On la divise par 8. (Ces deux
étapes constituent ce que l'on appelle une interpolation linéaire).
-
Si le résultat est non nul, on lui enlève
1. Cela va avoir pour effet l'atténuation de la couleur des flammes avec la
hauteur.
-
On place ainsi le résultat dans Buff2^[
320 * (y-1) + x ] (une
ligne au-dessus pour simuler la montée des flammes).
-
Une fois ces opérations effectuées
sur chaque point de Buff1^, on attend le retour de balayage vertical.
-
On copie ensuite les 200 premières lignes
de Buff2^ dans le tableau contenant l'écran et la totalité
de Buff2^ dans Buff1^.
Une fois ces étapes
terminées, il faut recommencer un nouveau cycle à partir du
remplissage aléatoire des 3 dernières lignes.
III. Quelques améliorations faciles et amusantes
-
Pour verser de l'eau sur le feu, on peut ajouter
des foyers noirs en nombre croissant.
-
On peut s'amuser avec la palette.
-
Essayez de créer un effet d'explosion (faites
apparaitre aléatoirement quelques foyers blancs sur tout l'écran
et laissez-les s'atténuer par interpolation).
-
Pour gagner en rapidité, on peut essayer
de calculer la moyenne des couleurs de seulement 4 points adjacents puis
diviser le tout par 4 (cependant, l'esthétique des flammes est moins
réussie).
-
Essayez de trouver de
la documentation sur les cooling maps. Ceci améliore
considérablement l'aspect des flammes. Je l'expliquerais peut
être un de ces quatres dans cette page, mais là, il est tard, je
vais aller dormir ...
Télécharger
un exemple avec sources
##########################################
# Auteur : Vincent PRAT aka Gore #
# e-mail : vprat@ifrance.com #
# Home page : http://vprat.ifrance.com #
# ICQ : 101306450 #
##########################################
-= Greets/coucous =-
.. Jerome, Guillaume, Gersandre ..
.. Les gens patients de #Codefr ..
PiedDePage(); ?>