Pong

Description

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.

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.