Le feu qui va consummer votre ecran

Contenu du snippet

Cette petite source génére un effet de feu dans une fenêtre SDL, bon j'avou las technique n'est pas de moi mais je l'ai transposé a ma sauce.
ce code fonctionne seulement avec une profondeur de couleur de 24 bits, car je trouve qu'un octet par composante de couleur est la plus logique et le plus simple à gérer.
J'ai éssayé de l'optimiser au mieux, si vous avez des suggestions, je suis preneur.

Conclusion :


#include <SDL/SDL.h>
#include <stdlib.h>

const int WIDTH = 400; /* largeur de l'ecran */
const int HEIGHT = 300; /* hauteur de l'ecran */
const int BPP = 24; /* profondeur de couleur */
char loop = 1; /* flag de boucle*/
Uint8 c; /*variable pour la couleur choisie au hazard sur les deux lignes du bas*/
SDL_Surface *screen; /*surface ecran*/
SDL_Event event;/*pour la gestion des événements*/

int main()
{
int WIDTH3 = 3 * WIDTH; /* Décalage d'un pixel vers le bas */
long tot = WIDTH * (HEIGHT - 2); /* adresse maximum de l'affichage des flammes*/
long k;/*compteur parcourant l'ecran moins deux lignes*/
long dec;/*décalage d'un pixel vers la bas pour k*/
int red;/* composante rouge*/
int green;/*composante verte*/
int blue;/*composante rouge*/
SDL_Init(SDL_INIT_VIDEO);/*Initialisation de SDL pour l'affichage*/
SDL_WM_SetCaption("FIRE", NULL);/*Texte de la fenêtre*/
screen = SDL_SetVideoMode(WIDTH, HEIGHT, BPP, SDL_DOUBLEBUF | SDL_HWSURFACE);/*Définition de la surface primaire*/
SDL_FillRect(screen, NULL, 0);/* on peint tout en noir*/

while(loop)
{
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
loop = 0;
break;
case SDL_KEYDOWN:
if(event.key.keysym.sym == SDLK_q) loop = 0; /* si on appuie sur q, on quitte*/
break;
default:
break;
}
}
/*SDL_LockSurface(screen);*/
for(k = tot; k < (WIDTH * HEIGHT); k++) /*boucle parcourant l'adresse des deux derniéres ligne de l'ecran*/
{
c = (rand() / (RAND_MAX /155)) + 100;
  • ((Uint8*)(screen->pixels) + k * 3 + 2) = c; /*on positionne à cette adresse qui correspond à la composante rouge, une valeur choisie au hazard entre 100 et 255*/
  • ((Uint8*)(screen->pixels) + k * 3 + 1) = c;/* """"" verte """"*/
  • ((Uint8*)(screen->pixels) + k * 3) = c;/*"""" bleu """""*/

}
for(k = 0; k < tot; k++)
{
red = 0; /* a chaque passage dans la boucle, on initialise les couleurs qui vont etre calculé à 0*/
green = 0;
blue = 0;
dec = 3 * (k + WIDTH); /*calcul du décalage qui correspond à l'adresse du pixel situé une ligne en dessous*/
red += *((Uint8*)(screen->pixels) + dec + 2); /*on lit la composante rouge du pixel en dessous du pixel courant*/
green += *((Uint8*)(screen->pixels) + dec + 1);/*idem pour le vert*/
blue += *((Uint8*)(screen->pixels) + dec);/*idem pour le bleu*/
red += *((Uint8*)(screen->pixels) + dec + WIDTH3 + 2);/* on lit la composante rouge du pixel 2 * en dessous du pixel courant*/
green += *((Uint8*)(screen->pixels) + dec + WIDTH3 + 1);/* idem pour le vert*/
blue += *((Uint8*)(screen->pixels) + dec + WIDTH3);/* idem pour le bleu*/
red += *((Uint8*)(screen->pixels) + dec + 5);/*on lit la composante rouge du pixel en dessous à droite du pixel courant*/
green += *((Uint8*)(screen->pixels) + dec + 4);/*idem pour le vert*/
blue += *((Uint8*)(screen->pixels) + dec + 3);/*idem pour le bleu*/
red += *((Uint8*)(screen->pixels) + dec - 1);/* on lit la composante rouge du pixel situé en dessoua à gauche*/
green += *((Uint8*)(screen->pixels) + dec - 2);/*idem pour le vert*/
blue += *((Uint8*)(screen->pixels) + dec - 3);/*idem pour le bleu*/
if(red > 1) red -= 1; else red = 0; /* si la composante rouge clculé on la décrémente de 2 ce qui à pour effet d'attenuer la couleur du feu plus il monte*/
if(green > 5) green -= 5; else green = 0;
if(blue > 100) blue -= 100; else blue = 0;
red >>= 2; /*calcul de la moyenne du rouge red /= 4 = red >>= 2 (décalage de 2 bits vers la droite (normalement c'est plus rapide)*/
green >>= 2;
blue >>=2;
  • ((Uint8*)(screen->pixels) + k * 3 + 2) = red; /*on ecrit le pixel courant avec les composantes calculées*/
  • ((Uint8*)(screen->pixels) + k * 3 + 1) = green;
  • ((Uint8*)(screen->pixels) + k * 3) = blue;

}

SDL_Flip(screen);

}
return 0;
}

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.