Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Faire un menu

Menu avec fichier ect...

    27 juillet 2006 à 18:50:30

    Bonjour a tous !

    je débute en C/C++ :-° En suivant le Tuto de Mateo21.
    Et je cherche comment faire une menu comme dans les logiciel de window avec Fichier edition ect ....
    Alors moi j'ai essayer avec du texte, mais j'arrive pas a combiner deus SDL_MOUSEBUTTONUP
    Mon code Affiche Fichier et Quitter, quand je clic sur fichier, un texte s'affiche mais quand je clic sur quitter, qui devrait quitter, rien ne se passe.

    Bon stop au blabla et voila le code:

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_ttf.h>

    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL , *fichier = NULL, *cliquerSurFichier= NULL, *quitter=NULL; //Les surfaces ecran, fichier, cliquez sur fichier
        SDL_Event event;//l'evenement pour la souris

        SDL_Rect souris, sourisQ, fichierTexte, positionCliquerSurFichier, posQuitter;// les position des texte des surface
        TTF_Font *police = NULL, *police2 = NULL; /* Stockera les informations de police */
        SDL_Color couleurNoir = {0, 0, 0};//Couleur du texte

        int continuer = 1; //Arreter le programme
        int fichierW = 0, fichierH = 0, quitterW = 0, quitterH = 0 ; //Taille de Fichier et de quitter

        SDL_Init(SDL_INIT_VIDEO);
        TTF_Init();

        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Menu de la fenetre", NULL);

        police = TTF_OpenFont("times.ttf", 20);
        police2 = TTF_OpenFont("times.ttf", 18);

        fichier = TTF_RenderText_Blended(police, "Fichier", couleurNoir);
        quitter = TTF_RenderText_Blended(police,"Quitter",couleurNoir);
        cliquerSurFichier = TTF_RenderText_Blended(police2,"Tu as bien cliquer sur Fichier",couleurNoir);


        SDL_WarpMouse(ecran->w / 2, ecran->h / 2);

        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;

                case SDL_MOUSEBUTTONUP:

                    souris.x = event.button.x ;
                    souris.y = event.button.y ;
                        if (event.button.button == SDL_BUTTON_LEFT && souris.x >=0 && souris.x <= (fichier->w) && souris.y >=0 && souris.y <= (fichier->h))
                            {
                                positionCliquerSurFichier.x = 0 ;
                                positionCliquerSurFichier.y = fichierH*2 ;
                                SDL_BlitSurface(cliquerSurFichier, NULL, ecran, &positionCliquerSurFichier);

                                SDL_Flip(ecran);
                            }
                         if (event.button.button == SDL_BUTTON_LEFT && souris.x >= (fichier->w +5) && souris.x <= (quitter->w) && souris.y >=0 && souris.y <= (quitter->h) )
                            {
                                continuer=0;
                            }

                    break;

                default:

                    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

                    fichierTexte.x= 0;
                    fichierTexte.y= 0;
                    SDL_BlitSurface(fichier, NULL, ecran, &fichierTexte);

                    fichierW = fichier->w;
                    fichierH = fichier->h;

                    posQuitter.x = fichierW +5 ;
                    posQuitter.y = 0 ;
                    SDL_BlitSurface(quitter, NULL, ecran, &posQuitter);

                    quitterW = quitter->w;
                    quitterH = quitter->h;

                    SDL_Flip(ecran);

                    break;


            }


        }

        TTF_CloseFont(police);
        TTF_CloseFont(police2);
        TTF_Quit();

        SDL_FreeSurface(fichier);

        SDL_Quit();


        return EXIT_SUCCESS;
    }


    Le probleme est certainement sur cette partit
    case SDL_MOUSEBUTTONUP:

    souris.x = event.button.x ;
    souris.y = event.button.y ;
    if (event.button.button == SDL_BUTTON_LEFT && souris.x >=0 && souris.x <= (fichier->w) && souris.y >=0 && souris.y <= (fichier->h))
    {
    positionCliquerSurFichier.x = 0 ;
    positionCliquerSurFichier.y = fichierH*2 ;
    SDL_BlitSurface(cliquerSurFichier, NULL, ecran, &positionCliquerSurFichier);

    SDL_Flip(ecran);
    }
    if (event.button.button == SDL_BUTTON_LEFT && souris.x >= (fichier->w +5) && souris.x <= (quitter->w) && souris.y >=0 && souris.y <= (quitter->h) )
    {
    continuer=0;
    }

    break;


    Voila, et en esperant que cette question a pas deja ete poster ! Je trouve pas rechercher et je voulait pas faire les 180 pages :lol:

    Merci a bientot
    • Partager sur Facebook
    • Partager sur Twitter
      27 juillet 2006 à 20:55:08

      Partie à revoir car si tu bouge le menu, sa ne marchera plus, de plus, en effet, sa foire un peu.
      Si je ne me trompe pas, voilà comment faire :
      case SDL_MOUSEBUTTONUP:

          souris.x = event.button.x ;
          souris.y = event.button.y ;
          if(event.button.button == SDL_BUTTON_LEFT)
          {
              if (souris.x >= fichier.x && souris.x <= (fichier.x + fichier->w) && souris.y >= fichier.y && souris.y <= (fichier.y + fichier->h))
              {
                  positionCliquerSurFichier.x = 0 ;
                  positionCliquerSurFichier.y = fichierH*2 ;
                  SDL_BlitSurface(cliquerSurFichier, NULL, ecran, &positionCliquerSurFichier);

              SDL_Flip(ecran);
              }
              else if (souris.x >= quitter.x && souris.x <= (quitter.x + quitter->w) && souris.y >= quitter.y && souris.y <= (quitter.y + quitter->h))
              {
                  continuer=0;
              }
          }
              break;
      • Partager sur Facebook
      • Partager sur Twitter
        27 juillet 2006 à 20:59:16

        Merci ! Je vait essayer ca desuite

        Hum je ne comprend pas tout!

        Mais j'ai prit ta base (qui ne marchait pas) il me mettait des erreur avec les .x et les .y

        Donc appartir de ce que tu ma montrer j'ai fait ca
        if(event.button.button == SDL_BUTTON_LEFT)
            {
                if (souris.x >=0 && souris.x <= (fichier->w) && souris.y >=0 && souris.y <= (fichier->h))
                {
                    positionCliquerSurFichier.x = 0 ;
                    positionCliquerSurFichier.y = fichierH*2 ;
                    SDL_BlitSurface(cliquerSurFichier, NULL, ecran, &positionCliquerSurFichier);

                SDL_Flip(ecran);
                }
               if ( souris.x >= (fichier->w +5) && souris.x <= (quitter->w) && souris.y >=0 && souris.y <= (quitter->h) )
                {
                    continuer=0;
                }
            }
                break;


        Mais la, il ne compile pas. Et voila ce que code block m'affiche <attention></attention>
        .objs\main.o:main.c:(.text+0x6a): undefined reference to `TTF_Init'
        .objs\main.o:main.c:(.text+0xb9): undefined reference to `TTF_OpenFont'
        .objs\main.o:main.c:(.text+0xd0): undefined reference to `TTF_OpenFont'
        .objs\main.o:main.c:(.text+0xed): undefined reference to `TTF_RenderText_Blended'
        .objs\main.o:main.c:(.text+0x10a): undefined reference to `TTF_RenderText_Blended'
        .objs\main.o:main.c:(.text+0x127): undefined reference to `TTF_RenderText_Blended'
        .objs\main.o:main.c:(.text+0x33d): undefined reference to `TTF_CloseFont'
        .objs\main.o:main.c:(.text+0x348): undefined reference to `TTF_CloseFont'
        .objs\main.o:main.c:(.text+0x34d): undefined reference to `TTF_Quit'
        collect2: ld returned 1 exit status
        Process terminated with status 1 (0 minutes, 0 seconds)

        Pourquoi il met des undefined reference en ce qui concerne la TTF <question></question>
        • Partager sur Facebook
        • Partager sur Twitter
          27 juillet 2006 à 22:08:07

          T'as du merder avec une include ou un linkage de SDL_TTF ! >_<

          Pour ce qui est des .x et .y, c'est du a un oubli de ma part.

          En considerant que fichier et quitter sont de type SDL_Surface*
          et que positionFichier et positionQuitter, de type SDL_Rect, sont les positions respectives des surface, considere le code ci-dessous :
          case SDL_MOUSEBUTTONUP:

              souris.x = event.button.x ;
              souris.y = event.button.y ;
              if(event.button.button == SDL_BUTTON_LEFT)
              {
                  if (souris.x >= positionFichier.x && souris.x <= (positionFichier.x + fichier->w) && souris.y >= positionFichier.y && souris.y <= (positionFichier.y + fichier->h))
                  {
                      positionCliquerSurFichier.x = 0 ;
                      positionCliquerSurFichier.y = fichierH*2 ;
                      SDL_BlitSurface(cliquerSurFichier, NULL, ecran, &positionCliquerSurFichier);

                  SDL_Flip(ecran);
                  }
                  else if (souris.x >= positionQuitter.x && souris.x <= (positionQuitter.x + quitter->w) && souris.y >= positionQuitter.y && souris.y <= (positionQuitter.y + quitter->h))
                  {
                      continuer=0;
                  }
              }
                  break;

          Il ne te reste plus qu'a adapter les noms des positions positionFichier et positionQuitter.

          Et là, ca marche ! :magicien: J'en mettrais ma main quelques-uns de mes longs cheveux à couper. ^^
          • Partager sur Facebook
          • Partager sur Twitter
            27 juillet 2006 à 22:11:54

            J'ai développez une classe Cpp pour gérer un menu, je suis entrain de la convertir en C et si j'espère pouvoir terminer à la rentrée (car pas chez moi en ce moment).

            je pense que tu devrais regrouper tes codes de détection dans des fonctions ce qui sera plus lisible et (peut être) plus facile à maintenir.
            • Partager sur Facebook
            • Partager sur Twitter
              28 juillet 2006 à 13:51:53

              Je comprend ce que tu veut dire par "tu devrais regrouper tes codes de détection dans des fonctions"

              Et j'ai essayer ton code, il marche impec, mais j'ai des problemes de librairie, il me met des erreur undefined SDL_Quit();
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                28 juillet 2006 à 13:56:58

                Pour ceux que ça interresse je crois qu'il existe aussi une bibliothèque d'extension de la SDL qui gère des menus comme ceux de l'API Win32.
                Vous pouvez chercher sur le site de la SDL.

                Duarna
                • Partager sur Facebook
                • Partager sur Twitter

                [SDL] Faire un menu

                × 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