Partage
  • Partager sur Facebook
  • Partager sur Twitter

menu en SDL

ma méthode est bonne ou...

    23 août 2006 à 11:59:04

    bonjour, j'ai fait un menu en SDL et je me demandé si il n'y avait pas plus facile ou plus optimiser ou ... mieux quoi ;)

    voila mon code :

    while (continuer)
        {
            //GESTION DES EVENEMENTS 
            SDL_PollEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_MOUSEMOTION:
                     
                     if(event.motion.x>100 && event.motion.y>100 && event.motion.y<164 && event.motion.x< 325){
                     couleurtexte.r = 255;
                     couleurtexte.g = 255;
                     couleurtexte.b = 0;
                     menu1 = TTF_RenderText_Blended(police, "Combat", couleurtexte);
                     }
                     else if(event.motion.x>100 && event.motion.y>250 && event.motion.y<314 && event.motion.x< 440){
                     couleurtexte.r = 255;
                     couleurtexte.g = 255;
                     couleurtexte.b = 0;
                     menu2 = TTF_RenderText_Blended(police, "Histoire", couleurtexte);
                     }
                     else if(event.motion.x>100 && event.motion.y>400 && event.motion.y<464 && event.motion.x< 550){
                     couleurtexte.r = 255;
                     couleurtexte.g = 255;
                     couleurtexte.b = 0;
                     menu3 = TTF_RenderText_Blended(police, "Entrainement", couleurtexte);
                     }
                     else{
                          couleurtexte.r = 255;
                          couleurtexte.g = 0;
                          couleurtexte.b = 0;
                          menu1 = TTF_RenderText_Blended(police, "Combat", couleurtexte);
                          menu2 = TTF_RenderText_Blended(police, "Histoire", couleurtexte);
                          menu3 = TTF_RenderText_Blended(police, "Entrainement", couleurtexte);
                     }
                     break;
            }
            //CODE
            positionFond.x = 0;
            positionFond.y = 0;
            SDL_BlitSurface(fond_menu, NULL, ecran, &positionFond);
            positionFond.x = 100;
            positionFond.y = 100;
            SDL_BlitSurface(menu1, NULL, ecran, &positionFond);
            positionFond.x = 100;
            positionFond.y = 250;
            SDL_BlitSurface(menu2, NULL, ecran, &positionFond);
            positionFond.x = 100;
            positionFond.y = 400;
            SDL_BlitSurface(menu3, NULL, ecran, &positionFond);
           
            SDL_Flip(ecran);
        }


    aussi un probleme etrange que j'ai rencontrer, dans mes if, le dernier test (pour ne pas dépasser la laregur du texte) j'ai voulu mettre menu1->w , mais sa ne marchait pas >< enfin,le rollover ne marchait pas sur la fin du texte, je ne voit pas d'ou ca peut venir
    • Partager sur Facebook
    • Partager sur Twitter
      24 août 2006 à 11:28:49

      Tu devrais stocker tes position dans un tableau, et afficher avec une boucle moi j'ai fait comme ca ( tres basique ) :


      int main(int argc, char *argv[])
      {
          SDL_Surface *ecran = NULL, *texte = NULL; // Initialise les surfaces;
          TTF_Font *police = NULL;   
          FSOUND_Init(44100, 5, 0);
          SDL_Rect positionMenu, positionTexte; // Crée des "objet" pour stocker des coordonnées;
              positionMenu.x = LARGEUR_FENETRE/2 - 566/2;
              positionMenu.y = 0;
              positionTexte.x = 100;
              positionTexte.y = 100;
             
          SDL_Event event; // Initialise une variables qui contiendra les événements;
         
         
         
          SDL_Init(SDL_INIT_VIDEO); // Initialise la SDL;
         
          TTF_Init();
          police = TTF_OpenFont("angelina.ttf", 65);
          TTF_SetFontStyle(police, TTF_STYLE_NORMAL);
         
          SDL_WM_SetCaption("Snake 3D/2D par T4g1 pour D4rk-C0w", NULL); // Titre du programme;
         
          ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); // Charge des surfaces;
         
          int continuer = 1, tailleselx = 0, taillesely = 0, i = 0, a = 1, tailleX[5] = {0}, tailleY[5] = {0}, YYY[5] = {0}, texty[5] = {0};
         
          SDL_Color couleurNoire = {0, 0, 0}, couleurVerte = {0,125,255};
         
          while (continuer) // boucle qui affiche le menu;
          {
              while(a) {
                  SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                  TTF_SetFontStyle(police, TTF_STYLE_NORMAL );
                  SDL_FreeSurface(texte);
                  texte = TTF_RenderText_Blended(police, "Appuie sur une touche", couleurVerte);
                  positionTexte.x = (LARGEUR_FENETRE / 2) - (texte->w / 2);
                  positionTexte.y = (HAUTEUR_FENETRE / 2) - (texte->h / 2);
                  SDL_BlitSurface(texte, NULL, ecran, &positionTexte);
                  SDL_WaitEvent(&event);
                  if (event.type == SDL_KEYDOWN) {
                      a = 0;
                  }   
              }   
                 
              if ( event.motion.x >= 100 && event.motion.y >= YYY[0] && event.motion.x <= (100 + tailleX[0]) && event.motion.y <= (YYY[0] + tailleY[0])) {
                  texty[0] = 1;
              }
              if ( event.motion.x >= 100 && event.motion.y >= YYY[1] && event.motion.x <= (100 + tailleX[1]) && event.motion.y <= (YYY[1] + tailleY[1])) {
                  texty[1] = 1;
              }
              if ( event.motion.x >= 100 && event.motion.y >= YYY[2] && event.motion.x <= (100 + tailleX[2]) && event.motion.y <= (YYY[2] + tailleY[2])) {
                  texty[2] = 1;
              }
              if ( event.motion.x >= 100 && event.motion.y >= YYY[3] && event.motion.x <= (100 + tailleX[3]) && event.motion.y <= (YYY[3] + tailleY[3])) {
                  texty[3] = 1;
              }
              if ( event.motion.x >= 100 && event.motion.y >= YYY[4] && event.motion.x <= (100 + tailleX[4]) && event.motion.y <= (YYY[4] + tailleY[4])) {
                  texty[4] = 1;
              }   
               
              SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
             
              positionTexte.x = 100;
              positionTexte.y = 100;
              YYY[0] = positionTexte.y;
              SDL_FreeSurface(texte);
              texte = TTF_RenderText_Blended(police, "Jouer", couleurNoire);
              tailleX[0] = texte->w;
                      tailleY[0] = texte->h;
                      if ( texty[0] == 1) {
                           TTF_SetFontStyle(police, TTF_STYLE_UNDERLINE );
                           texty[0] = 0;
                      }
                      SDL_FreeSurface(texte);
                      texte = TTF_RenderText_Blended(police, "Jouer", couleurNoire);
                      SDL_BlitSurface(texte, NULL, ecran, &positionTexte);
                      TTF_SetFontStyle(police, TTF_STYLE_NORMAL );
                     
                     
                      positionTexte.x = 100;
                      positionTexte.y = 200;
                      YYY[1] = positionTexte.y;
                      SDL_FreeSurface(texte);
                      texte = TTF_RenderText_Blended(police, "options", couleurNoire);
                      tailleX[1] = texte->w;
                      tailleY[1] = texte->h;
                      if ( texty[1] == 1) {
                           TTF_SetFontStyle(police, TTF_STYLE_UNDERLINE );
                           texty[1] = 0;
                      }
                      SDL_FreeSurface(texte);
                      texte = TTF_RenderText_Blended(police, "options", couleurNoire);
                      SDL_BlitSurface(texte, NULL, ecran, &positionTexte);
                      TTF_SetFontStyle(police, TTF_STYLE_NORMAL );
                     
                     
                      positionTexte.x = 100;
                      positionTexte.y = ((2 + 1) * 100);
                      YYY[2] = positionTexte.y;
                      SDL_FreeSurface(texte);
                      texte = TTF_RenderText_Blended(police, "Editeur de niveaux", couleurNoire);
                      tailleX[2] = texte->w;
                      tailleY[2] = texte->h;
                      if ( texty[2] == 1) {
                           TTF_SetFontStyle(police, TTF_STYLE_UNDERLINE );
                           texty[2] = 0;
                      }
                      SDL_FreeSurface(texte);
                      texte = TTF_RenderText_Blended(police, "Editeur de niveaux", couleurNoire);
                      SDL_BlitSurface(texte, NULL, ecran, &positionTexte);
                      TTF_SetFontStyle(police, TTF_STYLE_NORMAL );
                     
                     
                      positionTexte.x = 100;
                      positionTexte.y = ((3 + 1) * 100);
                      YYY[3] = positionTexte.y;
                      SDL_FreeSurface(texte);
                      texte = TTF_RenderText_Blended(police, "Score", couleurNoire);
                      tailleX[3] = texte->w;
                      tailleY[3] = texte->h;
                      if ( texty[3] == 1) {
                           TTF_SetFontStyle(police, TTF_STYLE_UNDERLINE );
                           texty[3] = 0;
                      }
                      SDL_FreeSurface(texte);
                      texte = TTF_RenderText_Blended(police, "Score", couleurNoire);
                      SDL_BlitSurface(texte, NULL, ecran, &positionTexte);
                      TTF_SetFontStyle(police, TTF_STYLE_NORMAL );
                     
                     
                      positionTexte.x = 100;
                      positionTexte.y = ((4 + 1) * 100);
                      YYY[4] = positionTexte.y;
                      SDL_FreeSurface(texte);
                      texte = TTF_RenderText_Blended(police, "Quitter", couleurNoire);
                      tailleX[4] = texte->w;
                      tailleY[4] = texte->h;
                      if ( texty[4] == 1) {
                           TTF_SetFontStyle(police, TTF_STYLE_UNDERLINE );
                           texty[4] = 0;
                      }
                      SDL_FreeSurface(texte);
                      texte = TTF_RenderText_Blended(police, "Quitter", couleurNoire);
                      SDL_BlitSurface(texte, NULL, ecran, &positionTexte);
                      TTF_SetFontStyle(police, TTF_STYLE_NORMAL );
                     
              SDL_Flip(ecran);
              SDL_WaitEvent(&event);
              switch(event.type)
              {
                  case SDL_QUIT:
                      continuer = 0;     
                      break;
                  case SDL_MOUSEBUTTONDOWN:
                      if ( event.motion.x >= 100 && event.motion.y >= YYY[0] && event.motion.x <= (100 + tailleX[0]) && event.motion.y <= (YYY[0] + tailleY[0])) {
                          jouer(ecran);
                          SDL_WaitEvent(&event);
                          score(ecran);
                      }
                      if ( event.motion.x >= 100 && event.motion.y >= YYY[1] && event.motion.x <= (100 + tailleX[1]) && event.motion.y <= (YYY[1] + tailleY[1])) {
                          options(ecran);
                      }
                      if ( event.motion.x >= 100 && event.motion.y >= YYY[2] && event.motion.x <= (100 + tailleX[2]) && event.motion.y <= (YYY[2] + tailleY[2])) {
                           editeur(ecran);
                      }
                      if ( event.motion.x >= 100 && event.motion.y >= YYY[3] && event.motion.x <= (100 + tailleX[3]) && event.motion.y <= (YYY[3] + tailleY[3])) {
                           score(ecran);
                      }
                      if ( event.motion.x >= 100 && event.motion.y >= YYY[4] && event.motion.x <= (100 + tailleX[4]) && event.motion.y <= (YYY[4] + tailleY[4])) {
                           continuer = 0;
                      }
                      break;
                  case SDL_KEYDOWN:
                      switch(event.key.keysym.sym)
                      {
                          case SDLK_ESCAPE:
                              continuer = 0;
                              break;
                      }   
                      break;
              }
          }

          SDL_FreeSurface(ecran);
          SDL_FreeSurface(texte);
          TTF_CloseFont(police);
          FSOUND_Close();
          SDL_Quit();
          TTF_Quit();
         
          return EXIT_SUCCESS;
      }


      Attention, j' ai pas choisis des nom de variable très explicite et j'ai codé ca quand je débutais, donc...
      • Partager sur Facebook
      • Partager sur Twitter

      menu en SDL

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown