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 :

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

 

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 ..