Le feu qui va consummer votre ecran

Soyez le premier à donner votre avis sur cette source.

Snippet vu 13 833 fois - Téléchargée 26 fois

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;
}
Ajouter un commentaire Commentaires
Messages postés
11
Date d'inscription
mercredi 3 novembre 2004
Statut
Membre
Dernière intervention
9 septembre 2008

j ai l'impression du DEJA VU !! ptet quelque part par ici : http://www.gnurou.org/writing/linuxmag/sdl/partie4 ; lol sinon je voudrais savoir si vous travaillez encore sur cet effet (optimisation, visuel, texture, scanline ...) ;;
Messages postés
39
Date d'inscription
samedi 3 juin 2006
Statut
Membre
Dernière intervention
28 octobre 2008

Pas mal c'est vrai que ça fait style...
C'est important d'avoir quelques programmes comme ça créés pour la beauté artistique :)
Messages postés
15
Date d'inscription
lundi 4 août 2003
Statut
Membre
Dernière intervention
8 juin 2007

www.libsdl.org
Messages postés
97
Date d'inscription
vendredi 14 octobre 2005
Statut
Membre
Dernière intervention
21 novembre 2006

salut j'aimerai bien avoir la biblio <SDL/SDL.h> pour compiler la source et merci

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.