Partage
  • Partager sur Facebook
  • Partager sur Twitter

SDL et c++

Le programme s'éteint sans explication!!

    2 juin 2007 à 12:43:37

    Salut tout le monde.
    Je vien de faire un petit programme en c++ avec SDL.
    Il doit juste (pour l'instant, je ne l'ai pas terminer) m'afficher le menu1. Mais malheureusement, sans aucun message d'erreur le programme s'éteint aussi vite qu'il est arrivé.
    A noter qu'il marchait très bien avant que je ne rajoute les "SuperSurface".
    Enfin bon, voila les codes sources.

    Le main:
    #include <iostream>
    #include <string>
    #include <SDL\SDL.h>
    #include <SDL\SDL_Image.h>
    #include "Menu.h"


    using namespace std;

    int main(int argc, char *argv[])
    {
       Menu Menu;

        SDL_Surface *ecran=NULL;
        SDL_Event event;

        int continuer = 1;

        SDL_Init(SDL_INIT_VIDEO);

        SDL_WM_SetIcon(IMG_Load("c++.jpg"), NULL); // L'icône doit être chargée avant SDL_SetVideoMode
        ecran = SDL_SetVideoMode(1200,800, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("test multiple, c++ et sdl", NULL);
        Menu.blitMenu(ecran);


        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE: // Veut arrêter le jeu
                            continuer = 0;
                            break;

                    }
                    break;
            }
           Menu.blitMenu(ecran);
        }



       SDL_Quit();


       return EXIT_SUCCESS;
    }





    Le Menu.h (qui contient les proto de la classe Menu)
    #ifndef DEF_MENU
    #define DEF_MENU

    class Menu
    {
        public:
        Menu();
         void  afficherMenu1(SDL_Surface*ecran);
           void  afficherMenu2(SDL_Surface*ecran);
          void lien1(SDL_Surface*ecran,int);
          void  blitMenu(SDL_Surface*ecrann);
          void lien1Ok(SDL_Surface*ecran);

        private:
        const char* m_menu1;
        const char* m_menu2;
        const char* m_lien1;
        bool m_retour;
        int m_menu;
    };




    #endif


    Le Menu.cpp(qui contient les fonctions de la classe Menu)
    #include <iostream>
    #include <string>
    #include <SDL\SDL.h>
    #include <SDL\SDL_Image.h>
    #include "Menu.h"

    using namespace std;


    Menu::Menu(): m_menu1("menu1.jpg"), m_menu2("menu2.jpg"), m_lien1("lien.jpg"), m_menu(1)
    {
    }

      void  Menu::afficherMenu1(SDL_Surface*ecran)
    {
        SDL_Surface *surface=IMG_Load(m_menu1),  *lien=IMG_Load(m_lien1), *SuperSurface[4];

        SuperSurface[0]=IMG_Load ("SuperSurface1.jpg");
        SuperSurface[1]=IMG_Load ("SuperSurface2.jpg");
        SuperSurface[2]=IMG_Load ("SuperSurface3.jpg");
        SuperSurface[3]=IMG_Load ("SuperSurface4.jpg");


        SDL_Rect PositionSurface, PositionLien, PoSuperSurface[4];

        PositionSurface.x=0;
        PositionSurface.y=0;

        PositionLien.x=100;
        PositionLien.y=300;

        PoSuperSurface[0].x=100;
        PoSuperSurface[0].y=300;

        PoSuperSurface[1].x=100;
        PoSuperSurface[1].y=400;

        PoSuperSurface[2].x=400;
        PoSuperSurface[2].y=300;

        PoSuperSurface[3].x=400;
        PoSuperSurface[3].y=400;

        SDL_BlitSurface(lien, NULL, surface, &PositionLien);
        SDL_BlitSurface(surface, NULL, ecran, &PositionSurface);
        for(int i=0; i<=4; i++)
        {
            SDL_BlitSurface(SuperSurface[i], NULL, ecran, &PoSuperSurface[i]);
        }
        SDL_Flip(ecran);

    }

      void  Menu::afficherMenu2(SDL_Surface*ecran)
    {
        SDL_Surface *surface2=IMG_Load(m_menu2);
        SDL_Rect PositionSurface2;
        PositionSurface2.x=0;
        PositionSurface2.y=0;

        SDL_BlitSurface(surface2, NULL, ecran, &PositionSurface2);
        SDL_Flip(ecran);
    }

      void  Menu::blitMenu(SDL_Surface*ecran)
    {
        switch (m_menu)
        {
            case 1:
            afficherMenu1(ecran);
            break;

            case 2:
            afficherMenu2(ecran);
            break;
        }
    }


    void Menu::lien1(SDL_Surface*ecran, int menu)
    {
       m_menu=menu;

        blitMenu(ecran);
    }

    void Menu::lien1Ok(SDL_Surface*ecran)
    {
        SDL_Surface*m_lien1=IMG_Load("lien1Ok.jpg");
    }


    Comme je l'ai dit au début, ceci n'est pas terminer (mais je teste régulièrement les programmes histoire de ne pas devenir fou à la fin si ça ne marche pas), et, comme vous l'avez surement remarqué je n'utilise pas du tout les fonctions "void lien1Ok(SDL_Surface*ecran);" et "void lien1(SDL_Surface*ecran,int);" (ça je me le réserve pour plus tard :lol: );
    Enfin, vos conseilles sont les bienvenues parceque pour l'instant je ne peut admirer mon beau menu(fait sur Paint :p )que pendant une fraction de seconde.
    • Partager sur Facebook
    • Partager sur Twitter
      2 juin 2007 à 20:26:34

      if(image == NULL)
      {
        fprintf(stderr, "Je n'ecoute pas les conseils de Mateo\n");
      }
      • Partager sur Facebook
      • Partager sur Twitter
        3 juin 2007 à 10:20:24

        de plus tu recharge tes supersurface a chaque affichage de ton menu.

        n'est il pas plus simple de les créer une bonne fois pour toute dans ton constructeur ?

        ensuite; toujours dans le meme cas, tu ne libere pas tes surface apres les avoir utilisée -> fuite de mémoire ...
        quand tu sors de la méthode Menu::afficherMenu1 les images n'on pas été supprimé et l'appel suivant de la fonction en créera d'autre.... bref, c'est pas bien :colere2:
        • Partager sur Facebook
        • Partager sur Twitter
          3 juin 2007 à 10:59:59

          :o Je n'avais pas vue pour les fuites....Merci de me l'avoir fait remarqué.

          En tout cas j'ai rajouté une méthode "free", que j'appelle avant chaque "re-blitage".
          void Menu::free()
          {
              SDL_FreeSurface(surface);
              SDL_FreeSurface(lien);
              SDL_FreeSurface(SuperSurface);
          }



          Et voici le début de Menu.cpp que j'ai changé:
          #include <iostream>
          #include <string>
          #include <SDL\SDL.h>
          #include <SDL\SDL_Image.h>
          #include "Menu.h"

          #define m_menu1 "menu1.jpg"
          #define m_menu2 "menu2.jpg"
          #define m_lien1 "lien.jpg"

          using namespace std;


          Menu::Menu(): SDL_Surface*surface(IMG_Load=m_menu1), SDL_Surface*lien(IMG_Load=m_lien1)
          {
              SDL_Surface*SuperSurface[4];
               SuperSurface[0]=IMG_Load ("SuperSurface1.jpg");
              SuperSurface[1]=IMG_Load ("SuperSurface2.jpg");
              SuperSurface[2]=IMG_Load ("SuperSurface3.jpg");
              SuperSurface[3]=IMG_Load ("SuperSurface4.jpg");
          }


          Pour le coup, là il y a une erreur de compilation:
          Project : SDL Application
          Compiler : GNU GCC Compiler (called directly)
          Directory : D:\Documents and Settings\LORMEAU.SN116721270315\Bureau\projet\c++\sld\
          --------------------------------------------------------------------------------
          Switching to target: default
          Compiling: main.cpp
          Compiling: Menu.cpp
          Menu.cpp: In constructor `Menu::Menu()':
          Menu.cpp:14: error: type `SDL_Surface' is not a direct base of `Menu'
          Menu.cpp:14: error: expected `(' before '*' token
          Menu.cpp:14: error: expected `{' before '*' token
          Menu.cpp: At global scope:
          Menu.cpp:14: error: expected constructor, destructor, or type conversion before '(' token
          Menu.cpp:14: error: expected `,' or `;' before '(' token
          Menu.cpp: In member function `void Menu::free()':
          Menu.cpp:99: error: cannot convert `SDL_Surface**' to `SDL_Surface*' for argument `1' to `void SDL_FreeSurface(SDL_Surface*)'
          Process terminated with status 1 (0 minutes, 1 seconds)

          Je crois que je vien de refaire une bourde :-° .

          Si j'ai bien compris, il me dit qu'on a pas le droit de mettre des "SDL_Surfac*" dans le constructeur, non?
          Mais alors comment faire?


          • Partager sur Facebook
          • Partager sur Twitter
            10 juin 2007 à 16:31:26

            c'est normal que tu ai une erreur de compilation.

            Citation : 77Arthur77

            Menu::Menu(): SDL_Surface*surface(IMG_Load=m_menu1), SDL_Surface*lien(IMG_Load=m_lien1)
            {

            une initialisation correctement faite :
            Personnage::Personnage() : m_vie(100), m_mana(100), m_nomArme("Epée rouillée"), m_degatsArme(10)
            {

            (cf cour de matéo ^^ )

            il y a au moins une erreur la dedans ... (je te laisse chercher)

            sinon tu a parfaitement le droit de creer des sdl surface dans un constructeur car il s'agit d'un type comme un autre (on se pose pas de question pour un int ou un double alors pourquoi pour un SDL_Surface)
            • Partager sur Facebook
            • Partager sur Twitter

            SDL et c++

            × 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