begin process at 2012 05 27 18:04:26
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

.Net

 > PONG

PONG


 Information sur la source

Note :
Aucune note
Catégorie :.Net Niveau :Débutant Date de création :18/02/2003 Date de mise à jour :18/02/2003 22:17:07 Vu / téléchargé :5 051 / 272

Auteur : coockiesch

Ecrire un message privé
Site perso
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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

  • // 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;
  • }
// 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.


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip CLASSE PERMETTANT DE GÉRER LES TAG ID3V1 DES MP3
Source avec Zip CALCULATRICE
CALCUL DE NOMBRES PREMIERS (NOMBRES DOUBLES --&GT; 1.7E308)
Source avec Zip Source .NET (Dotnet) ECRITURE ET LECTURE DANS UN FICHIER TEXTE EN C++ MANAGÉ

 Sources de la même categorie

Source avec Zip Source avec une capture ANALYSEUR LEXICAL par Donald180v
Source avec Zip Source avec une capture MAP_MAKER_JEU par seekplus
Source avec Zip Source avec une capture Source .NET (Dotnet) EMISSION D'UN OCTET SUR LE PORT SÉRIE - CLASSE SERIALPORT par jmchatelet01
Source avec Zip Source .NET (Dotnet) RESOLV EQU DE DEGRES N par darckangel731
Source avec Zip Source avec une capture Source .NET (Dotnet) INTEROP XCHAT / .NET : CHARGEUR DE PLUGINS MANAGÉS par TeBeCo

Commentaires et avis

Commentaire de coockiesch le 18/02/2003 22:21:54

Merci de déposer critiques, remarques, suggestions, améliorations.

coockiesch

Commentaire de GoldenEye le 18/02/2003 23:09:31

Pour un premier programme avec Allegro, c'est bien. Mais:

1/ J'ai rajouté un fps counter et le résultat est très décevant. J'ai un PC monstrueux et je n'atteins que 240 fps. En gros, il faut un Pentium 2 400Mhz pour faire tourner le prog... Pour un pong wof wof. Le programme n'est absolument pas optimisé, je te laisse trouver pourquoi. Pour info, une version optimisée permettrait d'atteindre des nombres à 4 voire 5 chiffres.

2/Attention le clavier est en qwerty (choix de l;m...)

3/Astuce blabla%2 est moins bien que blabla&1

4/ Idem pour blabla/2 moins bien que blabla&gt;&gt;1

5/Remplace le masked_blit par un draw_sprite, c'est 10% plus rapide

6/ Le changement de direction peut être factorisé

7/ Le source est un vrai bordel, découpe en plusieurs fichiers

8/ Dis moi, pourquoi rafraichis tu tout l'écran à chaque boucle d'affichage ? Alors que seule la zone de la balle ou la zone du plateau est modifiée. Réfléchis y

Commentaire de GoldenEye le 18/02/2003 23:14:04

Autre chose, 800*600 pour un Pong, je suis sceptique. Regarde mon Pacman, c'est du 320*240 et ça convient parfaitement. 800*600 est une rez à utiliser pour les monstres (RPG, jeux aboutis...), pas pour un pong. Ca augmente la config minimale pour rien.

Commentaire de cmarsc le 19/02/2003 08:59:32

srand((unsigned)time(NULL)); exit(1) &lt;stdlib.h&gt;  &lt;time.h&gt;

Commentaire de kjus le 19/02/2003 13:41:28

Salut,
Moi aussi j'ai fait un pong avec allegro (attention, je l'ai fait il y a longtemps c'est pas du tout programmé proprement, mais il est pas mal quand même)

J'ai repéré quelques petites erreurs au niveau des colision le long du mur gauche et du mur du haut :

    if(balle_y &lt;= 0 + balle-&gt;h / 2)
// virer "+ balle-&gt;h/2" ^^^

    // contre mur
    if(balle_x &lt;= 0 + balle-&gt;w / 2
// virer   + balle-&gt;w/2   ^^^^


Sinon, pour la gestion des touches, je te conseille de ne pas utiliser     if(keypressed()) puis readkey(). En effet, il existe un tableau key[] qui est contient constamment l'état de chaque touche.

Tu peut faire par exemple :
if (key[KEY_ESC] )
// touche echap pressée
if (key[KEY_L])
// touche l pressée

Bon courage

Commentaire de kjus le 19/02/2003 13:42:18

oops, voici l'adresse de mon pong si tu veux voir :
http://www.cppfrance.com/article.aspx?Val=841

Commentaire de Galett le 19/02/2003 18:18:05

euh, je connais pas vraiement allegro, mais tu dis Golden, pouvoir atteindre des fps à 240 ???, euh, t'es sûr ? pasque moi G un écran rafraichit ea 85Hz, et les fps peuvent pas aller plus vite que la musique(le taux de rafraichissement de l'écran), ou alors tu considères des frames mais qui passent en interne, ce n'est donc pas un vrai fps ?
enfin, je ne te fais pas le reproche personnellement, sur tous les sites qui proposent des benchmarks, je vois des "quake 3 à 150fps", je trouve ça bizarre qd même. Vous avez p'tet tous des super écran, et vous complotez tous contre moi pour me faire croire que les meilleurs sont à 100Hz....oula, faut que j'arrêtes moi :-)

Commentaire de GoldenEye le 19/02/2003 18:42:03

Ta question Galett est intéréssante. J'entends par fps le nombre de boucles d'affichage internes (les frames) par seconde. La confusion est souvent faite avec le taux de rafraichissement de l'écran, la fréquence en Hz dont tu parles (85,100 voire 120 Hz au grand maximum). Les fps internes du programmeur sont un bon moyen de mesurer la qualité du programme. En effet plus le nombre de boucles d'affichage est important, plus le programme sera fluide (au delà de la fréquence de rafraichissement de l'écran, on ne voit plus la différence entre 120 frames internes et 1200). Mais lorsque que la configuration du PC hôte baisse le nombre de fps interne risque de repasser en dessous de cette fréquence d'écran auqul cas des saccades apparaissent. Mieux vaut alors partir de 1200 fps que de 120. C'est à partir de là entre autres que l'on détermine la config minimale en dessous de laquelle l'anmation devient saccadée.

Pour le programme de coockiesch, le nombre de boucles internes est très faible ce qui laisse supposer une grosse config minimale.

Pour le Pacman voyez sur perso.wanadoo.fr/goldeneyerv
(en bas de la page)
Il n'y a pas de sons pour le moment mais l'affichage est ultra optimisé

Commentaire de coockiesch le 19/02/2003 18:50:56

Hello. Je ne sais pas comment compter efficacement les secondes pour calculer le fps. Comment faire? Merci

Commentaire de GoldenEye le 19/02/2003 19:28:29

/* 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
}

Commentaire de coockiesch le 19/02/2003 20:39:35

Merci!

Commentaire de coockiesch le 19/02/2003 22:37:00

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.

Commentaire de GoldenEye le 20/02/2003 00:18:22

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

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,562 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales