Un exemple de jeu avec Allegro : pong
Un article de Mangue.org, l'encyclopéde libre.
Voici un exemple de jeu programmé grâce à Allegro. Nous pouvons en convenir, ce jeu reste basique, et la structure de son code source très loin d'être un exemple de propreté, mais permet de bien comprendre les concepts de base de la programmation avec Allegro.
[modifier]
Le code source
#include <allegro.h> //Prototypes des fonctions void definir_x_y_balle(void); //Déclarations des structures et variables BITMAP *buffer; BITMAP *raquette; PALETTE palette; int raquette1_y,raquette2_y; int balle_x,balle_y; int balle_dx,balle_dy; //Variables ajoutés aux variables précèdentes pour bouger la balle int touche; //Variable servant à stocker les touches pressées sur le clavier bool exit_game=false; //Fonction ré-initialisant la position de la balle à l'écran void definir_x_y_balle(void) { balle_x=320; balle_y=240; balle_dx=2; balle_dy=2; if(rand()%2 == 0) balle_dx=-balle_dx; if(rand()%2 == 0) balle_dy=-balle_dy; } //Fonction main int main(int nArgs,char* Args[]) { //Initialise Allegro install_allegro(SYSTEM_AUTODETECT, &errno, atexit); //Initialise le clavier install_keyboard(); //Définit les couleurs set_color_depth(8); //Initialise le mode graphique if(set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0) < 0) { set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); allegro_message("Le programme ne peut pas être initialisé\n"); exit(1); } //Initialise le générateur pseudo-aléatoire srand((unsigned)time(NULL)); //Crée les bitmaps et initialise la palette buffer=create_bitmap(640,480); raquette=load_bitmap("raquette.pcx",palette); if(!raquette) { set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); allegro_message("L'image raquette ne peut être chargée\n"); exit(1); } set_palette(palette); definir_x_y_balle(); //Boucle infinie du programme do { //Effacement du bitmap "buffer" clear_bitmap(buffer); //La balle tape dans le bord haut de l'écran if(balle_y-10 <= 0) balle_dy=-balle_dy; //La balle tape dans le bord bas de l'écran if(balle_y+10 >= 479) balle_dy=-balle_dy; //La balle tape dans la raquette1 if(balle_y-10 <= raquette1_y+raquette->h && balle_y+10 >= raquette1_y && balle_x-10 <= raquette->w) balle_dx=-balle_dx; //La balle tape dans la raquette2 if(balle_y-10 <= raquette2_y+raquette->h && balle_y+10 >= raquette2_y && balle_x+10 >= 639-raquette->w) balle_dx=-balle_dx; //La balle sort de l'écran à gauche if(balle_x-10 <= 0) definir_x_y_balle(); //La balle sort de l'écran à droite if(balle_x+10 >= 639) definir_x_y_balle(); //Increment des coordonnées de la balle balle_x+=balle_dx; //Incrément de la position de la balle sur l'abscisse balle_y+=balle_dy; //Incrément de la position de la balle sur l'ordonnée //Gestion du clavier if(keypressed()) { touche=readkey()>>8; if(touche == KEY_A) raquette1_y-=4; if(touche == KEY_Z) raquette1_y+=4; if(touche == KEY_UP) raquette2_y-=4; if(touche == KEY_DOWN) raquette2_y+=4; if(touche == KEY_ESC) exit_game=true; } //Affichage du titre textout_centre(buffer,font,"PONG",320,10,1); //Affichage des sprites (raquettes, balles, etc.) sur le bitmap "buffer" circle(buffer,balle_x,balle_y,10,1); blit(raquette,buffer,0,0,0,raquette1_y,raquette->w,raquette->h); blit(raquette,buffer,0,0,639-raquette->w,raquette2_y,raquette->w,raquette->h); //Affichage du bitmap "buffer" à l'écran blit(buffer,screen,0,0,0,0,buffer->w,buffer->h); //Vide le tampon clavier clear_keybuf(); } while(!exit_game); return 0; } END_OF_MAIN();

