Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SFML] Bug

Code très simple

Sujet résolu
    10 octobre 2007 à 20:21:05

    Bonjours,

    Je me suis mis à SFML recemment pour voir un peu la gueule que ça a, pour le moment ça va mais là j'ai un petit bug, je suis sur qu'il est facile à résoudre mais ce soir je suis un peu fatigué alors si on pouvait m'aider un tout petit peu... Le problème c'est que quand vous lancez le programme il faut que vous appuyez sur numPad 1 pour lancer la fonction jouer, et à partir de là, le programme plante, on ne peut plus rien faire, obliger de terminer le processus.

    1. #include "constantes.hpp"
    2. using namespace std;
    3. int main(void)
    4. {
    5.         sf::RenderWindow App(sf::VideoMode(800,600,32),"Jecht");
    6.         App.SetBackgroundColor(sf::Color(255,255,255));
    7.         sf::Event Event;
    8.         bool done = false;
    9.         while (!done)
    10.         {
    11.                 while (App.GetEvent(Event))
    12.                 {
    13.                         switch (Event.Type)
    14.                         {
    15.                         case sf::Event::Close:
    16.                                 done = true;
    17.                                 break;
    18.                         case sf::Event::KeyPressed:
    19.                                 switch (Event.Key.Code)
    20.                                 {
    21.                                 case sf::Key::Escape:
    22.                                         done = true;
    23.                                         break;
    24.                                 case sf::Key::Numpad1:
    25.                                         jouer(&App);
    26.                                         done = true;
    27.                                         break;
    28.                                 default:
    29.                                         break;
    30.                                 }
    31.                                 break;
    32.                         }
    33.                 }
    34.                 App.Display();
    35.         }
    36.         return EXIT_SUCCESS;
    37. }


    Le constantes.hpp contient juste un prototype et #include <SFML/Graphics.hpp> .

    ensuite jeu.cpp

    1. #include <SFML/Graphics.hpp>
    2. #include <iostream>
    3. using namespace std;
    4. void jouer(sf::RenderWindow *App)
    5. {
    6.         sf::Image image;
    7.         image.LoadFromFile("perso1.png");
    8.         sf::Sprite sprite;
    9.         sprite.SetImage(image);
    10.         sprite.SetTop(470);
    11.         sprite.SetLeft(5);
    12.         App->Draw(sprite);
    13.         float avancer=0;
    14.         sf::Event Event;
    15.         bool continuer=true;
    16.         while (continuer)
    17.         {
    18.                 while (App->GetEvent(Event))
    19.                 {
    20.                         switch (Event.Type)
    21.                         {
    22.                         case sf::Event::Close:
    23.                                 continuer=false;
    24.                                 break;
    25.                         case sf::Event::KeyPressed:
    26.                                 switch (Event.Key.Code)
    27.                                 {
    28.                                 case sf::Key::Escape:
    29.                                         continuer=false;
    30.                                         break;
    31.                                 case sf::Key::Right:
    32.                                         avancer += 40;
    33.                                         if (avancer > 640)
    34.                                                 avancer = 640;
    35.                                         sprite.SetLeft(avancer);
    36.                                         App->Draw(sprite);
    37.                                         break;
    38.                                 case sf::Key::Left:
    39.                                         avancer -= 40;
    40.                                         if (avancer < 0)
    41.                                                 avancer = 0;
    42.                                         sprite.SetLeft(avancer);
    43.                                         App->Draw(sprite);
    44.                                         break;
    45.                                 default:
    46.                                         break;
    47.                                 }
    48.                                 break;
    49.                         default:
    50.                                 break;
    51.                         }
    52.                 }
    53.         }
    54. }


    Je précise que je code sous visual studio C++ express et que je n'ai pas d'erreur, (j'ai des warnings mais croyait moi ils sont négligeants )

    Si vous voulez télécharger le projet avec tout dedans source+executable format zip taille 4.22 MB
    içi

    Je vous remercie d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      10 octobre 2007 à 22:13:35

      D'après ce que je vois ta fonction jouer attends un pointeur sur RenderWindow et toi tu lui envoie une référence...
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        10 octobre 2007 à 22:44:07

        Citation : Dr-Jackal

        D'après ce que je vois ta fonction jouer attends un pointeur sur RenderWindow et toi tu lui envoie une référence...

        Non, c'est juste (à ce niveau là). Je te conseille de bienr elire le tuto sur les références car là tu fais la faute la plus courante.
        Note que faire la fonction jouer comme suit me semble plus simple:
        1. void jouer(sf::RenderWindow &App); // On demande une référence


        Pour ton problème, mets tout en commentaire, essaye. Si le programme marche alors supprime un commentaire (= enlève les // au début de la ligne) et essaye, jusqu'à ce que ça plante. Tu trouveras ainsi facilement d'où vient le problème.
        • Partager sur Facebook
        • Partager sur Twitter
          11 octobre 2007 à 18:54:26

          donc dans la fonction jouer, car c'est juste quand je fait appel a la fonction jouer(numPad1) que sa plante. Je vais essayer je tien au courant.

          EDIT: bon je crois avoir cerner le problème, ça se passe dès que je rentre dans la boucle de jeu.cpp, je ne sais pas comment résoudre ce problème j'ai essayé ta proposition c'est a dire de passé une référence a la fonction jouer mais il n y a rien a faire. Donc voila si d'autre gens aurait vu un truc qui cloche ?
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            11 octobre 2007 à 19:25:37

            Ça plante comment? Ton image ne se modifie pas? Il manque p-ê un App.Display().
            • Partager sur Facebook
            • Partager sur Twitter
              11 octobre 2007 à 19:38:52

              le bug est assez bizarre, je ne peut pas bouger la fenetre est quand j'appuie sur la croix en haut a droite rien ne se passe, cependant quand je fait clique droit -> fermer dans la barre du bas (barre des taches) le programme se ferme et il renvoie 0x0 donc sa c'est terminer correctement

              ensuite

              j'ai essayer de rajouter App.Display()

              La sa marche enfin si on veux
              • L'image perso1.png ne s'affiche pas
              • La fenetre se ferme quand je clique sur la croix par exemple mais le programme continu (je fait ctrl alt suppr -> processus et je vois encore mon programme
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                11 octobre 2007 à 19:57:48

                Tu peux mettre ta nouvelle fonction jouer ici pour qu'on ai le même code.
                • Partager sur Facebook
                • Partager sur Twitter
                  11 octobre 2007 à 20:19:32

                  1. void jouer(sf::RenderWindow &Ref) // cette fois ci l'argument est une reference comme tu ma proposé
                  2. {
                  3.         sf::Image image;
                  4.         image.LoadFromFile("perso1.png");
                  5.         sf::Sprite sprite;
                  6.         sprite.SetImage(image);
                  7.         sprite.SetTop(200); // positionnement de mon image elle devrai apparaitre !
                  8.         sprite.SetLeft(200);
                  9.         Ref.Draw(sprite); // J'affiche mon image
                  10.         float avancer=0;
                  11.         sf::Event Event;
                  12.         bool continuer=true;
                  13.         while (continuer)
                  14.         {
                  15.                 while (Ref.GetEvent(Event))
                  16.                 {
                  17.                         switch (Event.Type)
                  18.                         {
                  19.                         case sf::Event::Close:
                  20.                                 continuer=false;
                  21.                                 break;
                  22.                         case sf::Event::KeyPressed:
                  23.                                 switch (Event.Key.Code)
                  24.                                 {
                  25.                                 case sf::Key::Escape:
                  26.                                         continuer=false;
                  27.                                         break;
                  28.                                 case sf::Key::Right:
                  29.                                         avancer += 40;
                  30.                                         if (avancer > 640)
                  31.                                                 avancer = 640;
                  32.                                         sprite.SetLeft(avancer);
                  33.                                         Ref.Draw(sprite);
                  34.                                         break;
                  35.                                 case sf::Key::Left:
                  36.                                         avancer -= 40;
                  37.                                         if (avancer < 0)
                  38.                                                 avancer = 0;
                  39.                                         sprite.SetLeft(avancer);
                  40.                                         Ref.Draw(sprite);
                  41.                                         break;
                  42.                                 default:
                  43.                                         break;
                  44.                                 }
                  45.                                 break;
                  46.                         default:
                  47.                                 break;
                  48.                         }
                  49.                 }
                  50.                 Ref.Display() // La je l'ai mit mais sache que si je la met mon programme ne sarrete pas
                  51.         }
                  52. }


                  Si tu as des doute sur l'apelle de la fonction voila quelque lignes de ma fonction main

                  1. sf::RenderWindow App(sf::VideoMode(800,600,32),"Jecht");
                  2.         sf::RenderWindow &Ref = App;


                  et

                  1. case sf::Key::Numpad1:
                  2.                                         jouer(Ref);
                  3.                                         done = true;
                  4.                                         break;
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    11 octobre 2007 à 20:35:48

                    1. case sf::Key::Numpad1:
                    2. jouer(App);
                    3. done = true;
                    4. break;

                    Ce code marche très bien, pas besoin de créer une variable 'Ref', le compilo le fait pour toi lors de l'appel de la fonction jouer.

                    1. avancer += 40;
                    2. if (avancer > 640)
                    3.         avancer = 640;
                    4. sprite.SetLeft(avancer);

                    Essaye avec Move, ça me parait plus simple à mettre en place. (Note : le résulta sera le même.)

                    Dans ton switch, enlève les
                    1. Ref.Draw(sprite);
                    et met les juste avant le Display. Car si tu n'appuies sur rien, ton image ne sera pas affichée.


                    • Partager sur Facebook
                    • Partager sur Twitter
                      11 octobre 2007 à 20:43:38

                      Je te remercie grandement hiura ! J'ai enlever les Ref.Draw(sprite) j'en ai mit un juste avant display et sa marche ! Encore merci problème résolue.

                      EDIT: j'ai remis mon code comme avant et sa marche. Très bizarre ça.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme

                      [SFML] Bug

                      × 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