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 pondre 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...
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.