Un petit effet de feu pas grandiose mais utile pour comprendre le concept.
La première ligne de la barrière de feu est faite au pif. Puis après, chaque pixel des lignes au dessus a pour couleur la moyenne des pixels environnants. Pour faire mourir le feu, on diminue la couleur dès qu'on monte d'une ligne supplémentaire
Source / Exemple :
//Effet de feu par GoldenEye:très facile
#include "allegro.h"
#include <stdlib.h>
#include <time.h>
#include <sys/farptr.h>
int main()
{
RGB couleur;
int i,x,y;
unsigned char flamme[800][150]={0};//tableau qui contiendra les couleurs
unsigned long adress;
unsigned char col;
srand(time(0));
allegro_init();
install_keyboard();
set_gfx_mode(GFX_AUTODETECT,800,600,0,0);//résolution 800*600
for (i=0;i<140;i++)//création de la palette
{
couleur.r=(i*63/140);//teintes rouges
couleur.g=0;
couleur.b=0;
set_color(i,&couleur);
}
for (i=140;i<200;i++)//teintes jaune orange
{
couleur.r=63;
couleur.g=i/2-64;
couleur.b=0;
set_color(i,&couleur);
}
for(i=200;i<256;i++)//teintes bleues
{
couleur.r=0;
couleur.g=0;
couleur.b=(255-i);
set_color(i,&couleur);
}
while(!keypressed())//tant qu'on a pas touché au clavier
{
for(y=1;y<150;y++)//hauteur de la flamme=150
for(x=1;x<799;x++)
{
if(y<2)//si on est au bas de la flamme
col=rand()%200+50;//une couleur au pif dans les teintes orange bleu
else//sinon
{//la couleur du pixel x,y est la moyenne des 4 pixels en dessous->c'est la base de l'effet
col=(flamme[x-1][y-1]+flamme[x+1][y]+flamme[x+1][y-1]+flamme[x-1][y])>>2;
if (col!=0&&rand()%3==0)//petit artifice pour réduire le feu
col--;
}
flamme[x][y]=col;//actualise le tableau des couleurs
if(y>1)//on n'affichera pas la première ligne qui est pas jolie
_farpokeb(screen->seg,(unsigned long)screen->line[600-y]+x,col);//mieux que putpixel
}
}
allegro_exit();
return 0;
}
Conclusion :
Si vous avez des idées pour améliorer la vitesse ou la palette de couleurs...
Ce code ne marche que pour DJGPP, pour Visual C++ remplacer _farpokeb par un putpixel mais c'est très lent
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.