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.


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();
Outils personels