Réalisations Tutoriels FAQS

me contacter

 

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

Télécharger cette page pour impression

{hit} visiteurs

(c) 2000 Vincent PRAT