[djgpp] effet de feu (très basique)

Contenu du snippet

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

A voir également

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.