C'est un petit pong fait avec allegro. La balle rebondi contre les murs et contre la palette. La balle peux rebondir de 5 façons sur la palette et elle peux prendre 4 directions au départ.
In zip: main.cpp, l'exe, alleg41.dll, raquette.bmp, balle.bmp, balle.wav (pour quand la balle rebondi sur la palette).
Vous excuserez les graphiques pas beaux et le son un peu pourris. Si il y a des bugs, merci de me le faire savoir.
Soyez indulgents c mon premier prog avec allegro.
Source / Exemple :
// main.cpp, Rafael Guglielmetti, 18.02.2003, coockiesch@yahoo.fr
#include <allegro.h>
void initialisations();
void definir_balle();
int balle_x, balle_y;
int incrementation_x, incrementation_y;
int raquette_x;
int touche, perdu = 0;
double vitesse;
bool choix = false, jouer = true;
int main()
{
initialisations();
BITMAP *buffer, *raquette, *balle;
SAMPLE *son_balle;
buffer = create_bitmap(SCREEN_W, SCREEN_H);
raquette = load_bitmap("raquette.bmp", NULL);
balle = load_bitmap("balle.bmp", NULL);
son_balle = load_sample("balle.wav");
// vérif que tous les fichiers sont la
// (raquette.bmp, balle.bmp, balle.wav)
if(!raquette || !balle)
{
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
allegro_message("Le fichier raquette.bmp et/ou le \nfichier balle.bmp n'a pas ete trouve!");
exit(1);
}
if(!son_balle)
{
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
allegro_message("Le fichier balle.wav n'a pas ete trouve!");
exit(1);
}
clear_bitmap(buffer);
clear_keybuf();
textout_centre(buffer, font, "Tapez l pour lent, m pour moyen ou r pour rapide", SCREEN_W / 2, SCREEN_H / 2, makecol(255, 255, 255));
blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
while(!choix)
{
if(keypressed())
{
touche = readkey() >> 8;
if(touche == KEY_L)
{
vitesse = 2;
choix = true;
}
else if(touche == KEY_M)
{
vitesse = 1;
choix = true;
}
else if(touche == KEY_R)
{
vitesse = 0.5;
choix = true;
}
}
}
raquette_x = (SCREEN_W - raquette->w) / 2;
definir_balle();
// jeu
while(jouer)
{
if(keypressed())
{
touche = readkey() >> 8;
if(touche == KEY_ESC)
jouer = false;
}
// collision?
// contre plafond
if(balle_y <= 0 + balle->h / 2)
incrementation_y = -incrementation_y;
// contre mur
if(balle_x <= 0 + balle->w / 2 || balle_x >= SCREEN_W - balle->w)
incrementation_x = -incrementation_x;
// contre raquette
if(balle_y >= SCREEN_H - 5 - raquette->h - balle->h && balle_x >= raquette_x - balle->w / 2 && balle_x <= raquette_x + (raquette->w - balle->w/2))
{
// 5 possibilités : milieu, début -> 1/4, 1/4 -> 1/2, 1/2 -> 3/4, 3/4 -> fin
if(balle_x + balle->w / 2 < raquette_x + raquette->w / 4)
incrementation_x = -4;
else if(balle_x + balle->w / 2 >= raquette_x + raquette->w / 4 && balle_x + balle->w / 2 < raquette_x + raquette->w / 2)
incrementation_x = -2;
else if(balle_x + balle->w / 2 == raquette_x + raquette->w / 2)
incrementation_x = 0;
else if(balle_x + balle->w / 2 > raquette_x + raquette->w / 2 && balle_x + balle->w / 2 < raquette_x + raquette->w * 0.75)
incrementation_x = 2;
else if(balle_x + balle->w / 2 >= raquette_x + raquette->w * 0.75)
incrementation_x = 2;
incrementation_y = -incrementation_y;
play_sample(son_balle, 255, 128, 1000, 0);
}
// balle meurt
else if(balle_y >= SCREEN_H - 5 - raquette->h - balle->h)
{
definir_balle();
++perdu;
}
// mouvement de la raquette
raquette_x = mouse_x;
if(raquette_x > SCREEN_W - raquette->w)
raquette_x = SCREEN_W - raquette->w;
// mouvement de la balle
balle_x += incrementation_x / vitesse;
balle_y += incrementation_y / vitesse;
clear_bitmap(buffer);
//affichage
textprintf_centre(buffer, font, SCREEN_W / 2, 5, makecol(156, 135, 241), "Nombre de balle perdues: %d", perdu);
masked_blit(balle, buffer, 0, 0, balle_x, balle_y, balle->w, balle->h);
blit(raquette, buffer, 0, 0, raquette_x, SCREEN_H - raquette->h - 5, raquette->w, raquette->h);
blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
}
return 0;
}
END_OF_MAIN();
void initialisations()
{
// Fonction d'initialisation générale
install_allegro(SYSTEM_AUTODETECT, &errno, atexit);
install_keyboard();
install_mouse();
install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, "pong");
// on passse en 65536 couleurs
set_color_depth(16);
//on passe en 800*600
set_gfx_mode(GFX_AUTODETECT, 800, 600, 0, 0);
// on teste la souris, si pas la on quitte
if(install_mouse() == -1)
{
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
allegro_message("La souris n'a pas pu etre installee! ");
exit(1);
}
// on teste le passage en 800*600
if(set_gfx_mode(GFX_AUTODETECT, 800 ,600, 0, 0) != 0)
{
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
allegro_message("Probleme video! ");
exit(1);
}
// initialisation pour les nombres pseudo_aléatoires
srand((unsigned)time(NULL));
}
void definir_balle()
{
balle_x = SCREEN_W / 2;
balle_y = SCREEN_H / 4;
incrementation_x = 2;
incrementation_y = 2;
// on ajoute un peu hasard à la direction de départ de la balle
// (4 possibilités)
if(rand() % 2 == 0)
incrementation_x = -incrementation_x;
if(rand() % 2 == 0)
incrementation_y = -incrementation_y;
}
Conclusion :
Je ne crois pas que trops de bugs soient présents.
Je vais essayer de généraliser la procédure de collision afin d'en faire PEUT-ETRE un jeu casse brique.
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.