[djgpp & allegro] effet d'éclairage

Description

Mettre impérativement le GoldenEye.bmp dans C:\Windows\Bureau. Si il n'existe pas de répertoire à ce nom, en créer un. Ce problème n'existera plus dans les futures versions.
Si VOUS en faites la demande, je suis prêt à faire un tutoriel détaillé de la chose.
Téléchargez le zip: il contient le source ainsi qu'un GoldenEye.bmp qui a les bonnes dimensions pour la démo

Source / Exemple :


#include "allegro.h"
#include <math.h> //pour sqrt

float rapport(int i,int j,float xc,float yc) //méthode de Lambert pour l'éclairage
{
    float Mx;
    float My;
    float rapport;
    Mx=(i-xc)/xc;
    My=(j-yc)/yc;
    rapport=1-sqrt(Mx*Mx+My*My);
    return((rapport<0)?0:rapport); //la couleur du pixel courant une fois qu'on aura
}  // multiplié par 200

int main()
{
    BITMAP *doublebuffer,*spot,*fond,*nom;
    RGB palR[256],palV[256],palB[256],palcour[256],couleur;
    int k,l,color1,color2,i,j;
    float xcentre=160;
    float ycentre=120;
    allegro_init();
    install_keyboard();
    doublebuffer=create_bitmap(320,240);
    clear(doublebuffer);   // évite les cochonneries
    set_gfx_mode(GFX_AUTODETECT,320,240,0,0);
    for(i=0;i<256;i++) // la palette ne contient que des nuances de rouge,vert,bleu
    {
        palR[i].r=i/4;  // rouge
        palR[i].g=0;
        palR[i].b=0;
        palV[i].r=0;    //vert
        palV[i].g=i/4;
        palV[i].b=0;
        palB[i].r=0;    //bleu
        palB[i].g=0;
        palB[i].b=i/4;
    }
    fond=load_bitmap("C:\\WINDOWS\\BUREAU\\GoldenEye.bmp",palcour);
    textprintf(screen,font,100,120,255,"Un psychopathe...");
    couleur.r=63;      //rouge
    couleur.g=0;
    couleur.b=0;
    set_color(254,&couleur);
    couleur.r=0;
    couleur.g=63;   //vert
    couleur.b=0;
    set_color(253,&couleur);
    couleur.r=0;
    couleur.g=0;
    couleur.b=63;      //bleu
    set_color(252,&couleur);
    textprintf(screen,font,0,0,254,"R pour Rouge");
    textprintf(screen,font,0,10,253,"V pour Vert");
    textprintf(screen,font,0,20,252,"B pour Bleu");
    textprintf(screen,font,0,30,200,"[ESC] pour se tirer");
    textprintf(screen,font,0,40,150,"Une touche pour continuer");
    textprintf(screen,font,0,50,100,"[Up] [Down] [Left] [Right] pour bouger");
    readkey();
    fade_out(1); //effet de palette: ça s'éteint  au fur et à mesure...
    clear_to_color(screen,0);  // évite les saloperies à l'écran suivant
    set_palette(palR);
    for(i=0;i<320;i++)    //construit le spot lumineux
        for(j=0;j<240;j++)
                putpixel(doublebuffer,i,j,(200*rapport(i,j,160,120)));
    spot=create_bitmap(320,240);
    clear(spot);
    blit(doublebuffer,spot,0,0,0,0,320,240); //copie le doublebuffer dans spot
    draw_sprite(doublebuffer,fond,0,0); // dessine le fond
    textprintf(doublebuffer,font,130,0,255,"GoldenEye");
    fond=create_bitmap(320,240);
    blit(doublebuffer,fond,0,0,0,0,320,240); //copie le fond+texte dans fond
    i=0;
    j=0;
    while(key[KEY_ESC]==0)
    {
        draw_character(doublebuffer,spot,i,j,0);//efface la position précédente du spot
        if(key[KEY_R]!=0)
            set_palette(palR);//met en rouge si la touche r est enfoncée
        if(key[KEY_V]!=0)
            set_palette(palV); //met en vert
        if(key[KEY_B]!=0)
            set_palette(palB);  //et en bleu
        if(key[KEY_DOWN]!=0 && j<170)
        {
           j+=10;
           ycentre+=10;// en bas
        }
        if(key[KEY_UP]!=0 && j>-170)
        {
           j-=10;
           ycentre-=10;  // en haut
        }
        if(key[KEY_LEFT]!=0 && i>-200)
        {
           i-=10;  // à gauche
           xcentre-=10;
        }
        if(key[KEY_RIGHT]!=0 && i<200)
        {
           i+=10; // à droite
           xcentre+=10;
        }
        draw_sprite(doublebuffer,spot,i,j); // actualise en redessinant le spot
        for(k=0;k<320;k++)   // on éteint les pixels non contenus
        {  // dans le champ d'éclairage du spot
            for(l=0;l<240;l++) // qui est une ellipse  a=1 b=1/2
            {    if(((k-xcentre)*(k-xcentre))+(l-ycentre)*(l-ycentre)*2>25000)
                       putpixel(doublebuffer,k,l,0); // pixel éteint
                 else  //si le pixel est dans le spot, on applique mon algo d'éclairage
                { // on fait la moyenne pond‚r‚e des couleurs du fond et du spot
                    color1=getpixel(fond,k,l);   // avec coeff 1 et 3 respectivement
                    color2=getpixel(spot,k-xcentre+160,l-ycentre+120);
                    if (color1<0) color1=0;
                    if (color2<0) color2=0;
                    putpixel(doublebuffer,k,l,(color1+3*color2)/4);      //coeff 1 et 3
                }
            }
        }
        vsync();  //  synchro avec l'‚cran
        blit(doublebuffer,screen,0,0,0,0,320,240);  // swap virtuel/réel
    }
    fade_out(1);   //effet de palette:on éteint la lumière
    destroy_bitmap(doublebuffer);
    destroy_bitmap(spot);
    destroy_bitmap(fond); // on fait propre
    allegro_exit();
    return 0;
}

Conclusion :


J'espère que ce n'est pas trop lent sur les petites configs. A vous de me le dire...

Codes Sources

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.