Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Problème SDL] : Mon code plante mais C::B ne voit le pas.

Problème avec "SDL_SetColorKey();" je crois

Sujet résolu
    22 juillet 2007 à 18:16:01

    Bonjour à tous !

    J'améliore le jeu de tire que l'on fait dans le tuto de m@teo sur les sons FMOD.
    Quand je compile avec Code::Blocks, la page s'ouvre et se ferme "à la vitesse de la lumière". Pourtant j'ai une boucle infinie (ou presque), et C::B n'affiche aucune erreur :euh: mais je crois qu'elle viens de la fonction "SDL_SetColorKey();" qui gère la transparence.

    Voilà mon code complet:


    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <FMOD/fmod.h>

    int main(int argc, char *argv[])
    {
        SDL_Init(SDL_INIT_VIDEO);
        FSOUND_Init(44100, 32, 0);

        SDL_ShowCursor(SDL_DISABLE);

        int continuer = 1;
        long nombreBalle = 6;
        SDL_Event event;
        SDL_Surface *ecran = NULL, *maison = NULL, *mir = NULL;
        SDL_Rect positionMir, positionMaison;
        FSOUND_SAMPLE *tir = NULL, *vide = NULL, *recharge = NULL;

        ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        maison = SDL_LoadBMP("MaisonBlanche.bmp"); //ou IMG_Load
        SDL_SetColorKey(maison, SDL_SRCCOLORKEY, SDL_MapRGB(maison->format, 0, 0, 255)); //C'est ici que ça BUG !!
        mir = IMG_Load("mir.png");

        tir = FSOUND_Sample_Load(FSOUND_FREE, "pan.wav", 0, 0, 0);
        vide = FSOUND_Sample_Load(FSOUND_FREE, "vide.wav", 0, 0, 0);
        recharge = FSOUND_Sample_Load(FSOUND_FREE, "recharge.wav", 0, 0, 0);

        positionMaison.x = 0;
        positionMaison.y = 0;

        positionMir.x = ecran->w / 2 - mir->w / 2;
        positionMir.y = ecran->h / 2 - mir->h / 2;

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

                //SOURIS
                case SDL_MOUSEBUTTONDOWN:
                    if (event.button.button == SDL_BUTTON_LEFT)
                    {
                        if (nombreBalle >= 1)
                        {
                            FSOUND_PlaySound(FSOUND_FREE, tir);
                            nombreBalle --;
                        }
                        else
                        {
                            FSOUND_PlaySound(FSOUND_FREE, vide);
                        }
                    }
                    break;
                case SDL_MOUSEMOTION:
                    positionMir.x = event.motion.x  - (mir->w / 2);
                    positionMir.y = event.motion.y  - (mir->h / 2);
                    break;

                //CLAVIER
                case SDL_KEYDOWN:
                    switch (event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE:
                            continuer = 0;
                            break;
                        case SDLK_r:
                            FSOUND_PlaySound(FSOUND_FREE, recharge);
                            nombreBalle = 6;
                            break;
                    }
                    break;
            }
            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
            SDL_BlitSurface(maison, NULL, ecran, &positionMaison);
            SDL_BlitSurface(mir, NULL, ecran, &positionMir);
            SDL_Flip(ecran);
        }

        FSOUND_Sample_Free(tir);
        FSOUND_Sample_Free(vide);
        FSOUND_Sample_Free(recharge);
        FSOUND_Close();

        SDL_FreeSurface(mir);
        SDL_FreeSurface(maison);
        SDL_Quit();

        printf("Fin du code");
        return EXIT_SUCCESS;
    }
     


    Si vous avez une idée de ce qui se passe ça m'aiderait beaucoups.
    Mes "linkers" sont bons puisque sans la fonction "SDL_SetColorKey();" le code marche mais n'affiche que la Mir (viseur :ninja: ) et le fond noir mais pas la maison...

    HELP !!

    Moooi
    • Partager sur Facebook
    • Partager sur Twitter
      22 juillet 2007 à 18:36:31

      Assure toi que l"adresse du fichier de la maison est bonne.
      En théorie, le code peut etre bon mais si le programme arrive pas à trouver l'image, je crois que c'est ca qui fait que ton programme se ferme "en un éclair"
      • Partager sur Facebook
      • Partager sur Twitter
        22 juillet 2007 à 19:14:55

        Non le chemin est correct... Je comprends pas se qui se passe...

        Et les chemins de sons peuvent être faux mais ça marcherra quand même...
        • Partager sur Facebook
        • Partager sur Twitter
          22 juillet 2007 à 23:15:46

          Bonsoir, je n'ai pas trouvé d'erreur dans le code :euh: . En revanche, si c'est vraiment la fonction "SDL_SetColorKey();" qui fait planter, tu peux peut-être utiliser une image qui n'a pas besoin de cette fonction. Avec un logiciel de retouche, tu transformes ton image "MaisonBlanche.bmp" à fond bleu en une image "MaisonBlanche.gif" à fond transparent et en utilisant la fonction "IMG_Load", tu pourra supprimer "SDL_SetColorKey();". Cela ne marchera qu'à condition que ce soit bien cette fonction qui pose problème (ce dont je doute un peu o_O ).
          Bonne chance...
          • Partager sur Facebook
          • Partager sur Twitter
            23 juillet 2007 à 10:02:52

            En faite je sais pas trop d'où ça vient... je dit que c'est cette fonction parce que quand je l'enleve, le programme marche mais n'affiche pas la maison... (que la mir et le fond noir...)

            Sinon je voulais faire un PNG mais avec Google j'ai pas trouver de programme gratuit ou en démo qui permet de gérer la transparence a par pour des petits format (ICON...) si vous m'en trouver un ça marrengerait !!
            • Partager sur Facebook
            • Partager sur Twitter
              23 juillet 2007 à 10:09:50

              Testes les valeurs de retour !

              Quand tu fais :
              ma_surface = SDL_Load

              derriere, testes :


              if (ma_surface==NULL) 
              {
                 MessageBox(0,"Echec chargement ma_surface","error",0)// sous Windows
              }
               


              Sous Linux, colle un printf. Et pour les messageBox, ne travaille pas en plein ecran.
              • Partager sur Facebook
              • Partager sur Twitter

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

                23 juillet 2007 à 17:05:41

                ok le problème viens de là mais je sais pas pourquoi... (j'ai du faire un printf... MessageBox marche pas)
                • Partager sur Facebook
                • Partager sur Twitter
                  23 juillet 2007 à 17:56:14

                  En plus, printf au moins c'est bien portable. Essaies alors ceci :


                  if(maSurface == NULL)
                  {
                      printf("Echec chargement maSurface : %s", SDL_GetError());
                  }
                   

                  (normalement, dans ce if, faudrait aussi quitter et fermer proprement le programe, mais bon).
                  Ensuite, regardes dans le fichier stdout.txt que la SDL a créé dans le dossier de ton exécutable, tu devrais y voir ce message avec un message d'erreur de la SDL. Il devrait t'aider un peu à comprendre pourquoi ça veut pas charger.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
                    24 juillet 2007 à 16:30:23

                    Pour faire des PNG et plein d'autres choses, je te conseille Photofiltre. Il est gratuit, pas compliqué, complet, il a même des tutoriaux dans le Site Du Zéro (cf: Tutoriaux de design). Tout pour plaire! On le trouve facilement avec Google.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 juillet 2007 à 16:42:12

                      Ok merci beaucoups à tous !!
                      J'ai réinstaller la SDL et ça marche !!
                      Pourtant j'ai reussi a faire des programmes avec... bizare...
                      • Partager sur Facebook
                      • Partager sur Twitter

                      [Problème SDL] : Mon code plante mais C::B ne voit le pas.

                      × 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