Partage
  • Partager sur Facebook
  • Partager sur Twitter

Menu en C++ avec la SDL

Sujet résolu
    17 juillet 2007 à 21:34:28

    Bonjour, voila j'ai un problème au niveau d'un menu que je veux faire en SDL.
    Screenshot
    Donc normalement la flèche descends quand on appuie sur bas et monte quand on appuie sur haut. En plus j'ai un problème de transparence ...

    Main.cpp
    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL, *fond = NULL, *nom = NULL, *onglet[10],* curseur = NULL;
        SDL_Event event;
        int positionCurseur = 0;

        int continuer = 1;
        TTF_Font *police = NULL;

    /*---------------------------------------------------------------------*/

        SDL_Init(SDL_INIT_VIDEO);
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Menu", NULL);
        TTF_Init();
        police = TTF_OpenFont("polices/Defaut.ttf", 23);
        Menu menu(ecran,16,12);
        SDL_Color noir = {0, 0, 0};

        // -------------------------------- //

        onglet[0] = TTF_RenderText_Blended(police, "Inventaire", noir);
        onglet[1] = TTF_RenderText_Blended(police, "Compétences", noir);
        onglet[2] = TTF_RenderText_Blended(police, "Statut", noir);
        onglet[3] = TTF_RenderText_Blended(police, "Limites", noir);
        onglet[4] = TTF_RenderText_Blended(police, "Sauver", noir);
        onglet[5] = TTF_RenderText_Blended(police, "Quitter", noir);

    /*---------------------------------------------------------------------*/

    menu.image(ecran,fond, "images/fond.bmp",480,640,0,0,0,0);
    menu.texte(ecran,onglet[0],10,10);
    menu.texte(ecran,onglet[1],10,50);
    menu.texte(ecran,onglet[2],10,90);
    menu.texte(ecran,onglet[3],10,130);
    menu.texte(ecran,onglet[4],10,170);
    menu.texte(ecran,onglet[5],10,210);

    menu.image(ecran,curseur,"images/systeme.bmp",21,23,157,12,2,1);
    SDL_SetColorKey(curseur, SDL_SRCCOLORKEY, SDL_MapRGB(curseur->format, 0, 0,255));

    /*---------------------------------------------------------------------*/

    while (continuer)
    {
        SDL_PollEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
                break;
            case SDL_KEYDOWN:
                switch (event.key.keysym.sym)
                {
                    case SDLK_ESCAPE:
                        continuer = 0;
                        break;
                    case SDLK_UP :
                         if(positionCurseur>0)
                             positionCurseur --;

                        break;
                    case SDLK_DOWN :
                        if(positionCurseur < 7)
                             positionCurseur ++;

                        break;
                }
                break;
        }

                        switch (positionCurseur)
                        {
                            case 0 :
                            menu.image(ecran,curseur,"images/systeme.png",21,23,157,12,2,1);
                            break;
                            case 1 :
                            menu.image(ecran,curseur,"images/systeme.png",21,23,157,52,2,1);
                            break;
                            case 2 :
                            menu.image(ecran,curseur,"images/systeme.png",21,23,157,92,2,1);
                            break;
                            case 3 :
                            menu.image(ecran,curseur,"images/systeme.png",21,23,157,132,2,1);
                            break;
                            case 4 :
                            menu.image(ecran,curseur,"images/systeme.png",21,23,157,172,2,1);
                            break;
                            case 5 :
                            menu.image(ecran,curseur,"images/systeme.png",21,23,157,212,2,1);
                            break;
                        }
                                SDL_Flip(ecran);




    }



    /*-----------------------------------------------------------------------------------------*/
        TTF_CloseFont(police);
        SDL_FreeSurface(ecran);
        SDL_FreeSurface(nom);
        SDL_FreeSurface(onglet[10]);
        SDL_FreeSurface(curseur);
        SDL_FreeSurface(fond);
        TTF_Quit();
        SDL_Quit();
        return EXIT_SUCCESS;
    }
    }


    Menu.h

    class Menu
    {
        public :
        void texte( SDL_Surface *&dest, SDL_Surface *&surface, int x, int y);
        void image(SDL_Surface *&dest, SDL_Surface *&nom,char *sprite,int hauteur, int largeur, int init_x, int init_y,int x, int y );
        Menu(SDL_Surface *&dest,int init_x,int init_y);

        private :
        SDL_Rect pos;

    };



    Menu.cpp

    Menu :: Menu (SDL_Surface *&dest,int init_x,int init_y)
    {
    pos.x = init_x;
    pos.y = init_y;
    }

    void Menu :: image(SDL_Surface *&dest, SDL_Surface *&nom, char *sprite,int hauteur, int largeur, int init_x, int init_y,int x, int y )
    {
    SDL_Rect position;
    nom = IMG_Load(sprite);

    pos.x = init_x;
    pos.y = init_y;

    position.w = largeur;
    position.h = hauteur;
    position.x = x;
    position.y = y;

    SDL_BlitSurface(nom, &position, dest, &pos);
    SDL_Flip(dest);

    }

    void Menu :: texte( SDL_Surface *&dest, SDL_Surface *&surface, int x, int y)
    {
    SDL_Rect position;

    position.x = x;
    position.y = y;

    SDL_Flip(dest);


    }
     
    • Partager sur Facebook
    • Partager sur Twitter
      17 juillet 2007 à 22:08:03

      et c'est quoi le problème ?
      • Partager sur Facebook
      • Partager sur Twitter
        17 juillet 2007 à 23:18:36

        Je l'ai dit : quand j'appuies bas le curseur va pas en bas et quand j'appuies haut le curseur va pas en haut... Ha mais lol je me suis gourré de code j'édite puis tu me dis :p en plus tu as vu ya pas la gestion de transparence :( .
        • Partager sur Facebook
        • Partager sur Twitter
          18 juillet 2007 à 0:26:53

          Moi y'a un truc qui me perturbe c'est ce "*&", je vois pas l'utilité. Ca marche si tu les enlèves (enfin si tu enlèves l'éperluette &) ?
          Désolé de pas pouvoir t'aider plus mais ça fait dix minutes que j'ai le nez dans ton code source et j'me rends compte que je suis en train de lire les lettres de mon clavier donc si le problème n'a pas été résolu je jetterai un oeil après une bonne nuit de sommeil ^^
          • Partager sur Facebook
          • Partager sur Twitter
            18 juillet 2007 à 5:04:13

            Ca marche mais ça marche toujours pas :p ça change rien fondamentalemen t de virer les & ... Enfin pas pour ce blem en tout cas.
            • Partager sur Facebook
            • Partager sur Twitter
              18 juillet 2007 à 8:30:59

              SDL_FreeSurface(onglet[10]);


              je crois qu'il faut envoyer un pointeur à cette fonction? non?

              soit tu marques
              SDL_FreeSurface(onglet[0]);)
              SDL_FreeSurface(onglet[1]);)
              SDL_FreeSurface(onglet[2]);)
              SDL_FreeSurface(onglet[3]);)
              SDL_FreeSurface(onglet[4]);)
              SDL_FreeSurface(onglet[5]);)
              SDL_FreeSurface(onglet[6]);)
              SDL_FreeSurface(onglet[7]);)
              SDL_FreeSurface(onglet[8]);)
              SDL_FreeSurface(onglet[9]);)
              //ca compile avec onglet[10]???
               

              (mais un peu repetitif a mon gout ^^ )

              ou alors(pas vérifié) tu envoiele pointeur de ton tableau
              SDL_FreeSurface(onglet);

              </code>
              • Partager sur Facebook
              • Partager sur Twitter
                18 juillet 2007 à 11:00:58

                Dans ta fonction image de Menu.cpp tu fais un SDL_flip donc jusque là ça va, mais tu en fais un juste après (à la fin du switch) donc, à moins d'avoir une vue super fine, il est tout à fait normal que cela ne fonctionne pas (enfin, ça me paraitrait logique !)
                • Partager sur Facebook
                • Partager sur Twitter
                  18 juillet 2007 à 11:31:54

                  Pour le tableau je confirme, la fonction prend un pointeur en paramètre donc il faut que tu passes par une boucle pour désallouer la mémoire.
                  Et enfin, je crois voir d'où vient ton problème, tu flippes dest dans Menu::image et à fin du switch, tu reflippes ecran, qui lui n'a pas changé et te ressort ce qu'il y avait avant d'entrer dans le switch. En gros ça t'affiche : ecran, ecran avec curseur modifié, ecran, ecran avec curseur modifé... mais tellement rapidement que tu ne vois que "ecran".
                  Donc je reviens sur "*&" :p , vire ce & et ne flippe pas ecran à la fin de ton switch, ça devrait sûrement marcher.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 juillet 2007 à 13:14:40

                    tu as presque lu dans mes pensées dis donc :p
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 juillet 2007 à 21:41:26

                      SDL_FreeSurface(onglet[0]);)
                      SDL_FreeSurface(onglet[1]);)
                      SDL_FreeSurface(onglet[2]);)
                      SDL_FreeSurface(onglet[3]);)
                      SDL_FreeSurface(onglet[4]);)
                      SDL_FreeSurface(onglet[5]);)
                      SDL_FreeSurface(onglet[6]);)
                      SDL_FreeSurface(onglet[7]);)
                      SDL_FreeSurface(onglet[8]);)
                      SDL_FreeSurface(onglet[9]);)

                      // neuneu t'es neuneu :p d'abord le probleme ne vient pas de la libération de surfaces, ensuite au lieu de répéter à chaque fois ce que t'as dit t'aurais pu mettre une boucle de type for :
                      for (int i = 0;i <= 9;i++)
                      SDL_FreeSurface(onglet[i]); // ç'aurait été plus simple et plus efficace
                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 juillet 2007 à 11:53:15

                        Snif je pensais que ce serait bon mais ça fonctionne toujours pas, quand j'enlève un switch ou l'autre ...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 juillet 2007 à 13:31:42

                          wow ! le beau copier-coller remplaçable par un for :)

                          Normalement, il est possible de programmer sans faire de copier/coller !
                          (ni meme recopier a la main bien sur !)

                          Cela de façon, optimale, apres, on fait tous des copier/coller, mais il faut en mettre le moins possible :
                          pensez aux fonctions, et aux for.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Recueil de codes en C et C++ http://fvirtman.free.fr/recueil/index.html

                            25 juillet 2007 à 23:36:57

                            Je pense que mon erreur vient du fait que je crée une surface onglet à chaque fois que positionCurseur = ... mais je sais pas comment régler ça :p
                            • Partager sur Facebook
                            • Partager sur Twitter
                              26 juillet 2007 à 13:02:13

                              :lol: neuneu ok mais si j'ai pas ecrit la boucle c'etait pour expliquer ^^

                              question: tu n'aurais pas une erreur de segmentation?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                26 juillet 2007 à 19:34:06

                                Heuuu par segmentation t'entends quoi ? :-°
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  27 juillet 2007 à 3:10:39

                                  Tu sais, l'erreur qui vient lorsque tu lis dans ton tableau une valeur interdite, par exemple ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    27 juillet 2007 à 12:20:45

                                    Je crois pas avoir fait de telles erreurs ... je crois pas :euh::lol:
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      27 juillet 2007 à 14:42:40

                                      void Menu :: image(SDL_Surface *&dest, SDL_Surface *&nom, char *sprite,int hauteur, int largeur, int init_x, int init_y,int x, int y )

                                      j'avoue que tu te complique la vie.
                                      &* c pas un peu trop?
                                      (je ne sais pas à quois correspond dest mais je pense que c'
                                      estr une image comme pour nom

                                      enleve moi ce "&"
                                      (comme ca il suffira d'envoyer juste le nom de la variable sans signe)

                                      si c'
                                      est un tableau de pointeur il faudrait mettre "**"
                                       
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        28 juillet 2007 à 12:52:07

                                        moi personnellement je suis en train de faire un petit rpg, donc j'en ai plusieurs des menus , je fais des classes pour un oui ou pour un non mais faire une classe pour un menu alors là j'y aurais jamais penser moi perso je fais une fonction c'est plus lisible parce que là perso j'ai du mal a lire ton code .
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          31 juillet 2007 à 23:05:34

                                          themulot la fonction si tu la lis bien est destinée au menu mais aussi à d'autres trucs, le nom menu.cpp est j'avoue un peu idiot puisque ça concerne en fait la gestion d'images...
                                          Pour neuneutrinos dest corresponds à écran... Et quand tu dis " si c'est un tableau de pointeur il faudrait mettre "**" " tu parles de quoi ?? Merci
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            4 août 2007 à 9:20:12

                                            en fait tu envoie le pointeut qui pointe sur un pointeur de tableau...

                                            c'est pas claire ^^

                                            exemple

                                            SDL_Surface* pointeurImage[5];
                                            //on defini tout...
                                            //...
                                            void initTableau(SDL_Surface** nomDuTableau)//exemple initTableau(pointeurImage)
                                            {nomDuTableau[0]=IMG_Load("machin1.png");
                                            nomDuTableau[1]=IMG_Load("machin2.png");
                                            nomDuTableau[2]=IMG_Load("machin3.png");
                                            nomDuTableau[3]=IMG_Load("machin4.png");
                                            nomDuTableau[4]=IMG_Load("machin5.png");
                                            }

                                            j'ai fait ca rapidement ^^ c'est pas un exemple pratique mais tu vois comment l'utiliser
                                            (si je dit pas de betise :lol: )
                                             
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              4 août 2007 à 13:47:57

                                              Merci neuneutrinos mais mon problème a été résolu graçe à Nepser. Je retiens tout de même ce que tu m'as dit dans le dernier post :)
                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Menu en C++ avec la 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