Implémentation d'un Menu (allegro)

cs_Darksheep Messages postés 69 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 15 septembre 2009 - 4 juil. 2006 à 18:06
cs_Darksheep Messages postés 69 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 15 septembre 2009 - 9 juil. 2006 à 19:58
Bonjour ;

Désolé d'être un newbie ; je commence a comprendre les rudiments
d'allegro et j'aimerai ajouter un menu a mon début de jeu
(interprétation généreuse) .Voila LE menu de mes rèves (pour commencer)
une petite image, si l'on appuie sur ESC pendant le menu on quitte le
jeu , si l'on appuie sur ESC pendant le jeu on retourne au menu
.key[KEY_SPACE] pour lancer le jeu

Jai cherché et j'ai bidouillé ce que je pouvais avec des variables
bool, sans succes car lorsque j'appuie sur ESC je quitte tout ,sans
passer par la case Menu.

Utilisation de goto strictement interdite ^^.

Voila ma fonction Main :


int main(int argc, char *argv[])

{

if(init()<0) return 0;

init_game();

   while(!done)

   {  

        if(faire_menu) menu();

       

        while(temps_de_jeu < timer)

        {

         control();

         temps_de_jeu++;

         dessiner = true ;

        }

        if(dessiner)

        {

         clear(buffer);

         draw_all();

        }

         if(key[KEY_ESC]){faire_menu =true; }

   }

    deinit();

   return 0;

}

END_OF_MAIN()


Voila mon Menu :

void menu()

{

while(faire_menu)

 {

  blit((BITMAP*)data[TEXTURE2].dat,screen,0,0,0,0,640,480);

  if(key[KEY_ESC]) 

    {

    faire_menu = false;

    done = true ;

    }

  if(key[KEY_SPACE]) faire_menu = false;

 }

}


Alors pourquoi l'appuie sur la touche ESC déclenche la fermeture du
programe au lieu du retour au menu ? ne devrais-je pas à avoir a
appuyer 2fois sur ESC ?

10 réponses

vincelefou Messages postés 16 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 28 juillet 2007
6 juil. 2006 à 11:05
Salut ,

Personnellement, je coderai cela ainsi :

    int done = 0;
    int touche;
    //ici tu affiches le menu
    textprintf(screen,font,10,10,makecol(255,255,255),"* MENU *");
 
    while (!done) {
      //ici on teste les touches
      touche = readkey() >> 8;
      // touche ESC -> on sort
      if (touche == KEY_ESC)
        done = 1;
      // touche SPACE -> on joue
      if (touche == KEY_SPACE)
        textprintf(screen,font,10,30,makecol(255,0,0),"* JEU *");   
    }

A+

Vince Le Fou !
0
cs_Darksheep Messages postés 69 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 15 septembre 2009
7 juil. 2006 à 16:09
Désolé je fais un jeu par conséquent (arrétez moi si je dis des bétises
) je ne peux pas attendre pendant son déroulement (sauf quelques
circonstances précises ) la lecture d'un touche spécifique ,
(l'utilisation de readkey); Pendant le jeu les joueurs vont appuyer sur
, down , left ,sauter , tirer , courrir ....

De plus le menu doit se trouver dans la boucle évènement , puisque je
veux y retourner pour quitter et que je ne souhaite l'utilisation de
l'instrument goto.

 Je souhaite organiser mon menu de tel sorte que pendant le jeu ,
l'apuie de la touche ESC revoie au menu et qu'au menu un deuxieme apuie
de cette même touche suffise pour quitter le programme.Malheureusement
, j'ai l'impression que mon programme ne fais pas de différence entre
le premier et second apuie et quitte tout d'une seule traite.
0
cs_Darksheep Messages postés 69 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 15 septembre 2009
7 juil. 2006 à 16:33
Ce qui pourrait m'aider a ce propos aussi serait ce connaître , comment
faire une fonction qui retourne un quand une touche est non pas
préssée, mais relachée ?
0
vincelefou Messages postés 16 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 28 juillet 2007
7 juil. 2006 à 19:20
Salut,


Je ne vois pas ou se trouve ton problème ?
Si tu utilses un "switch( readkey()>>8)" , tu ne seras pas bloqué

A mon avis, tu dois faire 2 boubles.
Exemple :
1er boucle : pour le menu
condition de sortie de la 1er boucle => touche ESC

2eme boucle : traitement principale de ton jeu
condition de sortie de la 2eme boucle => touche ESC or Fin de partie(game over)...

      // 1er boucle
      while (...){



           test des touches
           si touche ESC => on quitte
           si touche SPACE => start => appel nouvelle procédure
      }
  
      // nouvelle procedure : 2eme boucle
      while (...){





      }
      effacement du buffer clavier puis
      RETURN => ce qui permet de revenir dans la 1er boucle


Es-tu d'accord avec cela ?

Vince Le Fou !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Darksheep Messages postés 69 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 15 septembre 2009
8 juil. 2006 à 13:00
Dsl je suis débutant : (pas bien compris XD) j'ignore tout de
"return  sans arguments a coté" En fait je n'ai pas été assez
clair mon problème , c'est que lorsque j'appuie sur ESC pendant le jeu
, cela valide ET la condition pour sortir du jeu ET la condition pour
sortir du menu ;cela fait que je quitte tout le programme sans passer
par la case menu des que j'appuie sur la touche ESC


while(!done)

   {  

        while(faire_menu)

         {

            clear_keybuf();

            blit((BITMAP*)data[TEXTURE2].dat,screen,0,0,0,0,640,480);

            if(key[KEY_SPACE]&&faire_menu) faire_menu = false;

             else if(key[KEY_ESC])

            {

            faire_menu = false ;

            done = true ;

             }

         }

       

        while(temps_de_jeu < timer)

        {

        

         control();

         temps_de_jeu++;

         dessiner = true ;

        }

      

        if(dessiner)

        {

         clear(buffer);

         draw_all();

        }

        
if(key[KEY_ESC]){faire_menu =true; } //Comme ça je reviens au menu , au
lieu de cela je quitte le jeu :'(

         if(key[KEY_A]) done = true ;

   }
0
vincelefou Messages postés 16 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 28 juillet 2007
8 juil. 2006 à 23:45
Voici un exemple de programme !
Recopie le et execute le ...

// DEBUT PROGRAMME
#include



void monmenu();
void monjeu();



int main() {
    // initialisation de base
 int depth, res;
 allegro_init();
 depth = desktop_color_depth(); if (depth 0) depth 32;
 set_color_depth(depth);
 res = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
 if (res != 0) {
  allegro_message(allegro_error);
  exit(-1);
 }



 install_timer();
 install_keyboard();
 install_mouse();
 srand(time(NULL));



    int done=0;
    int touche;
    // on affiche le menu
 monmenu();
    while (!done) {
        touche=readkey()>>8;
        if (touche==KEY_ESC)
          done=1;
        if (touche==KEY_SPACE) {
          monjeu();
          monmenu();
        }
 }



 return 0;
}
END_OF_MAIN();



void monmenu() {
   clear_bitmap(screen);
   textprintf(screen, font, 250, 50, makecol(255, 100, 0), "* Mon Menu *");
   textprintf(screen, font, 250, 65, makecol(255, 255, 0), " SPACE - jouer");
   textprintf(screen, font, 250, 75, makecol(255, 255, 0), "   ESC - exit");    
}



void monjeu() {
    
   int done2 = 0;
   // paramètres de la forme
   int x,y;  // coordonnées
   int tx,ty; // taille
   int px,py; // pas d'avancement en x et y
   // initialisation des variables de la forme
   clear_bitmap(screen);
   tx=rand()%20+20;
   x=rand()%(640-tx*2);
   x+=tx;
   px=(rand()%5)+2;



   ty=rand()%20+20;
   y=rand()%(480-ty*2);
   y+=ty;
   py=(rand()%5)+2;
   rectfill(screen,x,y,x+tx,y+ty,makecol(0,255,0));
  
   while (!done2){



       textprintf(screen, font, 10,10, makecol(255,255,255),
       "Appuyez sur les fleches haut,bas,gauche, droite et ESC pour quitter");    
    if (keypressed()){
           //effacement aux anciennes coordonnées
     rectfill(screen,x,y,x+tx,y+ty,makecol(0,0,0));
     switch (readkey()>>8){  // recup sous la forme scancode
    
        case KEY_UP :  y-=py;  break;
     case KEY_DOWN : y+=py;  break;
     case KEY_LEFT : x-=px;  break;
     case KEY_RIGHT :  x+=px;  break;
     case KEY_ESC : done2=1; break;// pour fin
     default : break;
     }
     // contrôle des bords
     x=(x+tx<0) ? 640-1 : x;
     x=(x>640) ? -tx+1 : x;
     y=(y+ty<0) ? 480-1 : y;
     y=(y>480) ? -ty+1 : y;
           // affichage
     rectfill(screen,x,y,x+tx,y+ty,makecol(0,255,0));
    }
   }
   clear_keybuf();
}
// FIN PROGRAMME


qu'en penses-tu ?

Vince Le Fou !
0
cs_Darksheep Messages postés 69 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 15 septembre 2009
9 juil. 2006 à 19:58
Tout simplement génial (je vais méditer dessus)
0
cs_Darksheep Messages postés 69 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 15 septembre 2009
9 juil. 2006 à 19:58
Tout simplement génial (je vais méditer dessus)
0
cs_Darksheep Messages postés 69 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 15 septembre 2009
9 juil. 2006 à 19:58
Tout simplement génial (je vais méditer dessus)
0
cs_Darksheep Messages postés 69 Date d'inscription samedi 4 novembre 2000 Statut Membre Dernière intervention 15 septembre 2009
9 juil. 2006 à 19:58
Tout simplement génial (je vais méditer dessus)
0
Rejoignez-nous