Pong

Soyez le premier à donner votre avis sur cette source.

Vue 6 295 fois - Téléchargée 347 fois

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

Ajouter un commentaire

Commentaires

cs_GoldenEye
Messages postés
527
Date d'inscription
vendredi 14 septembre 2001
Statut
Membre
Dernière intervention
6 octobre 2008
2 -
Ce n'est pas suffisant de changer la rez, ton rafraichissement d'écran n'est pas optimal. Par ailleurs la vitesse de déplacement dépend de la machine hôte, il faudrait harmoniser
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
Apparement le manque de FPS venait de la résolution: En 400 * 300 j'obtiens 800 FPS et en 320 * 240 1200 FPS. Mais a ce rythme là le déplacement est tellement trop rapide... C pas jouable, vais améliorer le tout et updater ma source.
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
Merci!
cs_GoldenEye
Messages postés
527
Date d'inscription
vendredi 14 septembre 2001
Statut
Membre
Dernière intervention
6 octobre 2008
2 -
/* VARIABLES GLOBALES */

volatile int fps,counter;

/*FONCTION FPS_COUNTER */

void fps_counter()
{
fps=counter;
counter=0;
}

après allegro_init(); tu mets

install_timer();
install_int_ex(fps_counter,BPS_TO_TIMER(1));

Et juste avant le blit(screen,....) tu colles : counter++;
Pour afficher ben tu fais un textprintf de %d,fps
}
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
Hello. Je ne sais pas comment compter efficacement les secondes pour calculer le fps. Comment faire? Merci

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.