Partage
  • Partager sur Facebook
  • Partager sur Twitter

SFML problème avec une sfImage

ca plante...

    17 septembre 2007 à 14:51:43

    Bonjour, j'ai pris connaissance récemment de l'existence de la bibliothèque SFML et j'ai essayé de m'en servir en créant un petit jeu en c++.
    J'ai créé une classe Menu qui affiche du texte cliquable sur un fond uni mais mon problème ne se situe pas au niveau de cette classe...
    Il se situe dans la boucle du jeu :

    jeu.cpp


    1. void jouer(sfRenderWindow &app)
    2. {
    3.     //on charge les images du personnage, des fruits et du fond
    4.     sfImage imagePerso;
    5.     sfImage imageBanane;
    6.     sfImage imagePoire;
    7.     sfImage imagePomme;
    8.     sfImage imageRaisin;
    9.     sfImage imageFond;
    10.     imagePerso.LoadFromFile("images/personnage.png");
    11.     imageBanane.LoadFromFile("images/banane.png");
    12.     imagePoire.LoadFromFile("images/poire.png");
    13.     imagePomme.LoadFromFile("images/pomme.png");
    14.     imageRaisin.LoadFromFile("images/raisin.png");
    15.     cout << "jusque la ca va ..." << endl;
    16.     if(!imageFond.LoadFromFile("images/fond.bmp"))
    17.         cout << "image mal chargee" << endl;
    18.     cout << "on est la" << endl;
    19.     //on crée le sprite du fond
    20.     sfSprite spriteFond;
    21.     spriteFond.SetImage(imageFond);
    22.     //on crée une liste de sprites vide (elle contiendra les sprites des fruits)
    23.     sfSprite *listeSprite=NULL;
    24.     int nbSprites=0;//cette variable contient le nombre de sprites contenu dans la liste
    25.     //on crée le sprite du personnage
    26.     sfSprite spritePerso;
    27.     spritePerso.SetImage(imagePerso);
    28.     spritePerso.SetLeft((LARGEUR-100)/2);
    29.     spritePerso.SetTop(HAUTEUR-200);
    30.     int niveau=0;//le niveau de difficulté augmentera au cours du jeu
    31.     int nbVies=3;//le nombre de vie diminue si on rate un fuit
    32.     sfClock horloge;//on crée l'horloge pour gérer le temps dans notre boucle principale
    33.     const sfInput& input = app.GetInput();//on crée le gestionnaire d'entrées associé à la fenetre
    34.     bool continuer=true;
    35.     while(continuer)
    36.     {
    37.         //on remet l'horloge a zero
    38.         horloge.Reset();
    39.         //si on appuie sur echap...
    40.         if(input.IsKeyDown(sfKey::Escape))
    41.             continuer=false;//on quitte la while
    42.         //on dessine le sprite du fond sur la fenetre
    43.         //app.Draw(spriteFond);
    44.         //on dessine les sprites des fruits sur la fenetre
    45.         for(int i=0 ; i<nbSprites ; i++)
    46.             app.Draw(listeSprite[i]);
    47.         //on dessine le sprite du perso sur la fenetre
    48.         app.Draw(spritePerso);
    49.         //on dessine la fenetre a l'ecran
    50.         app.Display();
    51.         //on attend que le temps écoulé soit égal au délai d'une boucle
    52.         while(horloge.GetElapsedTime()<DELAI)
    53.         {
    54.             sfSleep(DELAI-horloge.GetElapsedTime());
    55.         }
    56.     }
    57. }


    Dans mon code toutes les images portant des noms de fruits sont chargées ainsi que l'image du personnage, mais quand je veux charger l'image du fond, le programme plante au niveau du code "imageFond.LoadFromFile("images/fond.bmp")".
    Le message de mauvais chargement de l'image n'est même pas affiché dans la console, le programme s'arrête tout simplement...
    Je ne comprends pas où est l'erreur, j'ai créé toutes mes images avec photofiltre et il n'y a que celle du fond qui pose problème.
    Merci de m'aider !

    ps : je me rends compte qu'il y a un autre problème : quand je suis dans la fonction jouer que je vous ai présentée plus haut, lorsque je clique sur la croix en haut a droite de la fenetre, celle-ci se ferme, alors que je n'ai rien écrit comme code dans ma fonction pour que cela se produise.
    Est-ce que quelqu'un sait de quoi cela peut venir ?
    Merci et à bientot !
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      17 septembre 2007 à 15:01:45

      Salut.

      La fenêtre se ferme automatiquement si tu la ferme (logique au fond). Ce n'est pas un bug (déjà débattu sur le forum officiel).

      un conseil : n'utilise pas NULL, mais 0. (NULL = C, 0 = C++).
      Un deuxième : change la version de la sfml : la v1.1 est dans les bacs.

      Encore un truc : listeSprite n'est pas bien déclarée (il faudrait faire un tableau; tableau != pointeur).
      Tu essayes d'afficher listeSprite alors qu'elle est vide... Utilité ? (Tu as mis tout le code?)

      Voilà, bonne chance ;)
      • Partager sur Facebook
      • Partager sur Twitter
        17 septembre 2007 à 15:31:48

        Merci pour ta réponse.
        D'accord la fenetre se ferme mais si tu as des delete à faire comment ça se passe ?

        Pour ce qui est de listeSprite, en fait je n'ai pas fini le jeu (je fais étape par étape) et donc oui c'est normal que la liste soit vide (je vais la remplir dynamiquement avec des new par la suite).
        Par contre où est-ce que je dois remplacer NULL par 0 ? C'est une chose dont je n'avais jamais entendu parler (mais il faut dire que je suis débutant...).
        A bientot !
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          17 septembre 2007 à 15:40:05

          Tu mets partout (en C++) 0 à la place de NULL, c'est tout. (Conseillé par son créateur Stroupstrup.)

          Ok pour les new, c'est correcte.

          Citation : Pedrolino

          D'accord la fenetre se ferme mais si tu as des delete à faire comment ça se passe ?



          Quand la fenêtre est fermée , tu peux recevoir un évènement (sf::Event::Close). C'est pas parce que la fenêtre est fermée que ton programme est terminé ;) . Donc quand tu reçois cet évènement tu agit en conséquence.
          • Partager sur Facebook
          • Partager sur Twitter
            17 septembre 2007 à 16:23:38

            D'accord merci !
            J'ai téléchargé la version 1.1 et j'ai modifié mon code pour qu'il y soit adapté (j'ai rajouté des sf:: un peu partout, sans trop comprendre ce que je faisais)

            Maintenant ca compile mais j'ai un nouveau problème :
            Je vois la fenetre apparaitre un instant puis j'ai d'affiché dans la console le message suivant :
            "This application has requested the Runtime to terminate et in an unusual way. Please contact the application's support team for more information."

            Je suis désolé mais je ne comprends pas si quelqu'un sait ce qu'il convient de faire je suis preneur !
            • Partager sur Facebook
            • Partager sur Twitter
              17 septembre 2007 à 16:28:00

              probablement un segfault (pointeur fou) dans le genre :
              1. int* p;
              2. *p = 3;
              • Partager sur Facebook
              • Partager sur Twitter
                17 septembre 2007 à 16:32:31

                Je ne pense pas étant donné que mon programme avant que je ne l'adapte fonctionnait.
                Je vous redonne les codes pour voir si quelque chose vous saute aux yeux que je n'aurais pas vu...

                Menu.cpp


                1. Menu::Menu(sf::Color &couleurFond, sf::Color &couleurTexte, sf::Color &couleurFocus)
                2. {
                3.     m_couleurFond=couleurFond;//on ajuste les couleurs du fond du texte et du texte lorsqu'il a le focus
                4.     m_couleurTexte=couleurTexte;
                5.     m_couleurFocus=couleurFocus;
                6.     m_texte=0;//la liste des textes est initialisée a NULL
                7.     m_nbTextes=0;
                8.     m_position_x=0;
                9.     m_position_y=0;
                10. }
                11. Menu::~Menu()
                12. {
                13.     if(m_texte != 0)
                14.         delete[] m_texte;//on libère la liste
                15. }
                16. void Menu::ajouter(string texte)
                17. {
                18.     sf::String *tampon;//on va créer une liste tampon de la taille de la liste actuelle...
                19.     tampon=new sf::String[m_nbTextes];
                20.     for(int i=0 ; i<m_nbTextes ; i++)
                21.         tampon[i]=m_texte[i];//on la remplit
                22.     if(m_texte != 0)
                23.         delete[] m_texte;//on supprime la liste normale
                24.     m_nbTextes++;
                25.     m_texte=new sf::String[m_nbTextes];//puis on la recrée une taille plus grande
                26.     for(int i=0 ; i<m_nbTextes-1 ; i++)
                27.         m_texte[i]=tampon[i];//puis on la remplit
                28.     m_texte[m_nbTextes-1].SetText(texte);//sans oublier le dernier élément
                29.     m_texte[m_nbTextes-1].SetFont("comic.ttf");
                30.     m_texte[m_nbTextes-1].SetSize(30.f);
                31.     m_texte[m_nbTextes-1].SetColor(m_couleurTexte);
                32.     if(tampon != 0)
                33.         delete[] tampon;//puis on détruit la liste tampon
                34.     for(int i=0 ; i<m_nbTextes ; i++)
                35.     {
                36.         sf::FloatRect rect;
                37.         rect=m_texte[i].GetRect();
                38.         m_texte[i].SetLeft((LARGEUR-rect.GetWidth())/2);
                39.         m_texte[i].SetTop(HAUTEUR/(m_nbTextes+1)*(i+1));//puis on réajuste les positions de tous les textes
                40.     }
                41. }
                42. void Menu::dessiner(sf::RenderWindow &app)
                43. {
                44.     app.SetBackgroundColor(m_couleurFond);//on reajuste la couleur du fond
                45.     for(int i=0 ; i<m_nbTextes ; i++)
                46.         app.Draw(m_texte[i]);//puis on dessine tous les textes de la liste
                47. }
                48. int Menu::testerClic(sf::RenderWindow &app)//on renvoie le numero de la ligne (la premiere est la 0) ou -2 si on ferme la fenetre
                49. {
                50.     for(int i=0 ; i<m_nbTextes ; i++)
                51.         m_texte[i].SetColor(m_couleurTexte);//on remet les couleurs d'origine pour le texte
                52.     sf::Event event;
                53.     bool clic=false;//vaut true si un clic est fait (qu'il soit ou non sur un texte)
                54.     while(app.GetEvent(event))
                55.     {
                56.         switch(event.Type)
                57.         {
                58.             case sf::Event::Close://renvoie -2 si on ferme la fenetre
                59.                 return -2;
                60.                 break;
                61.             case sf::Event::MouseMove:
                62.                 m_position_x=event.Mouse.X;//enregistre la position de la souris
                63.                 m_position_y=event.Mouse.Y;
                64.                 break;
                65.             case sf::Event::MouseButtonPressed:
                66.                 clic=true;//clic=true si on clique dans la fenetre
                67.                 break;
                68.         }
                69.     }
                70.     sf::FloatRect rect;
                71.     for(int i=0 ; i<m_nbTextes ; i++)//on parcoure la liste
                72.     {
                73.         rect=m_texte[i].GetRect();
                74.         if(rect.Contains(m_position_x, m_position_y))//si la souris est dans la surface du texte actuel
                75.         {
                76.             m_texte[i].SetColor(m_couleurFocus);//on change la couleur
                77.             if(clic)
                78.                 return i;//et on renvoie le numero de la ligne si l'utilisateur a cliqueé dessus
                79.         }
                80.     }
                81.     return -1;//par défaut on retourne -1
                82. }


                jeu.cpp


                1. void jouer(sf::RenderWindow &app)
                2. {
                3.     //on charge les images du personnage, des fruits et du fond
                4.     sf::Image imagePerso;
                5.     sf::Image imageBanane;
                6.     sf::Image imagePoire;
                7.     sf::Image imagePomme;
                8.     sf::Image imageRaisin;
                9.     sf::Image imageFond;
                10.     imagePerso.LoadFromFile("images/personnage.png");
                11.     imageBanane.LoadFromFile("images/banane.png");
                12.     imagePoire.LoadFromFile("images/poire.png");
                13.     imagePomme.LoadFromFile("images/pomme.png");
                14.     imageRaisin.LoadFromFile("images/raisin.png");
                15.     cout << "jusque la ca va ..." << endl;
                16.     if(!imageFond.LoadFromFile("images/fond.bmp"))
                17.         cout << "image mal chargee" << endl;
                18.     cout << "on est la" << endl;
                19.     //on crée le sprite du fond
                20.     sf::Sprite spriteFond;
                21.     spriteFond.SetImage(imageFond);
                22.     //on crée une liste de sprites vide (elle contiendra les sprites des fruits)
                23.     sf::Sprite *listeSprite=0;
                24.     int nbSprites=0;//cette variable contient le nombre de sprites contenu dans la liste
                25.     //on crée le sprite du personnage
                26.     sf::Sprite spritePerso;
                27.     spritePerso.SetImage(imagePerso);
                28.     spritePerso.SetLeft((LARGEUR-100)/2);
                29.     spritePerso.SetTop(HAUTEUR-200);
                30.     int niveau=0;//le niveau de difficulté augmentera au cours du jeu
                31.     int nbVies=3;//le nombre de vie diminue si on rate un fuit
                32.     sf::Clock horloge;//on crée l'horloge pour gérer le temps dans notre boucle principale
                33.     const sf::Input& input = app.GetInput();//on crée le gestionnaire d'entrées associé à la fenetre
                34.     bool continuer=true;
                35.     while(continuer)
                36.     {
                37.         //on remet l'horloge a zero
                38.         horloge.Reset();
                39.         //si on appuie sur echap...
                40.         if(input.IsKeyDown(sf::Key::Escape))
                41.             continuer=false;//on quitte la while
                42.         //on dessine le sprite du fond sur la fenetre
                43.         //app.Draw(spriteFond);
                44.         //on dessine les sprites des fruits sur la fenetre
                45.         for(int i=0 ; i<nbSprites ; i++)
                46.             app.Draw(listeSprite[i]);
                47.         //on dessine le sprite du perso sur la fenetre
                48.         app.Draw(spritePerso);
                49.         //on dessine la fenetre a l'ecran
                50.         app.Display();
                51.         //on attend que le temps écoulé soit égal au délai d'une boucle
                52.         while(horloge.GetElapsedTime()<DELAI)
                53.         {
                54.             sf::Sleep(DELAI-horloge.GetElapsedTime());
                55.         }
                56.     }
                57. }


                main.cpp


                1. int main()
                2. {
                3.         //On crée la fenêtre du programme
                4.         sf::RenderWindow app(sf::VideoMode(LARGEUR, HAUTEUR, 32), "Fruits!!");//on crée la fenetre du programme
                5.     sf::Color couleurFond(0, 0, 100);//on crée les couleurs nécessaires a la création du menu
                6.     sf::Color couleurTexte(0, 100, 0);
                7.     sf::Color couleurFocus(255, 0, 0);
                8.     Menu menu(couleurFond, couleurTexte, couleurFocus);//on crée le menu
                9.     menu.ajouter("jouer");
                10.     menu.ajouter("creer animation de fond");//deux options pour le menu
                11.     int choix=-1;
                12.     bool continuer=true;
                13.     while(continuer)
                14.     {
                15.         choix=menu.testerClic(app);//on teste le clic et la position de la souris pour notre menu
                16.         menu.dessiner(app);//on le dessine
                17.         app.Display();//on copie a l'ecran
                18.         switch(choix)
                19.         {
                20.              case -2://si l'utilisateur ferme la fenetre...
                21.                 continuer=false;//on quitte la boucle
                22.                 break;
                23.             case 0:
                24.                 jouer(app);
                25.                 break;
                26.             case 1:
                27.                 //animationFond(app);
                28.                 break;
                29.         }
                30.     }
                31.         return EXIT_SUCCESS;
                32. }
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  17 septembre 2007 à 16:46:24

                  J'ai pas lu, mais je sais ce que c'est. :p

                  J'ai eut la même chose en passant de la 1.0 à la 1.1. (Le correctif et déjà dans le svn.) La correction officiel ne devrait pas tarder.

                  Enfait c'est un problème avec les sf::String. Il y a un bug en créant une sf::String avec comme argument une std::string. Il faut utiliser les std::wstring.

                  Je te passe un code de conversion que tu pourras enlever lors de la prochaine release.

                  1. /** Il y a un bug avec la version 1.1 de la SFML :
                  2.                            on corrige temporairement, même si c'est pas beau **/
                  3.                         if (!s.empty())
                  4.                         {
                  5.                             std::vector<wchar_t> Buffer(s.size());
                  6.                             mbstowcs(&Buffer[0], s.c_str(), s.size());
                  7.                             std::wstring ws;
                  8.                             ws.assign(&Buffer[0], Buffer.size());
                  9.                             MaSFString.SetText(ws);
                  10.                         } /* fin if (!s.empty()) */


                  s est une std::string et MaSFString est une sf::String.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 septembre 2007 à 17:09:56

                    Merci !
                    Ce problème-là est résolu, mais le problème principal que j'avais ne l'est pas...
                    En effet, même après la mise à jour de la version de SFML, j'ai toujours le même problème : lorsque je veux charger l'image de mon fond, le programme s'arrête.
                    J'ai cerné la ligne qui pose problème avec ces lignes de codes :
                    1. cout << "jusque la ca va" << endl

                    et
                    1. cout << "on est la " << endl

                    et résultat, le jusque la ca va s'affiche mais pas le on est la

                    J'en conclus que c'est entre ces deux lignes que se situe le problème, a savoir le code :
                    1. if(!imageFond.LoadFromFile("images/fond.bmp"))
                    2.         cout << "image mal chargee" << endl;


                    Mais le texte "image mal chargee" ne s'affiche pas, donc l'erreur doit venir de... je sais pas où...
                    S'il vous plait aidez-moi !!! :(
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      17 septembre 2007 à 17:31:47

                      Il est possible que ton image soit corrompue (ça aussi ça m'est arrivé :-° ).

                      Remplace temporairement fond.bmp par banane.png pour tester.
                      Si ça marche cette fois, il faut que tu refasse le fond...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 septembre 2007 à 17:56:36

                        En fait je l'ai déjà refait plusieurs fois et voilà ce que je constate

                        si je fais une image plutot petite (40*40) en .png ou en .bmp sans utiliser la transparence alors elle apparait toute moche (pas les bonnes couleurs et comme si plusieurs images étaient mises les unes sur les autres mais en décalé).

                        si je fais une image peu importe la taille en .png avec la transparence (et ce n'est pas ce que je veux ici) alors elle apparait correctement. (uniquement si il y a de la transparence dedans)

                        et enfin si je fais une image de 600*600 en bmp alors ca ne marche pas...

                        Voilà où j'en suis...
                        J'arrête pas de refaire des images depuis tout à l'heure et je stagne...
                        Aidez-moi s'il vous plait !!! :(
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          17 septembre 2007 à 18:02:48

                          hummm... Je te conseille d'aller sur le forum officiel et de poster. Bug ou pas Bug je ne sais pas.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          SFML problème avec une sfImage

                          × 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