Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SFML] Animé un sprite

Sujet résolu
    2 décembre 2007 à 12:14:48

    Bien le bonjour
    J'ai lu un topic sur l'animation d'un sprite avec la SFML et j'ai écrit un bout de code mais il ne marche pas : il plante lors de l'execution du programme
    1. #include <iostream>
    2. #include <string>
    3. #include <SFML/System.hpp>
    4. #include <SFML/Graphics.hpp>
    5. int main()
    6. {
    7.         sf::Clock Horloge;
    8.         sf::RenderWindow fenetre;
    9.         sf::Event Event;
    10.         sf::Image Fond, Soleil, Chocobo;
    11.         sf::Sprite FondSprite, SoleilSprite, ChocoboSprite[4];
    12.         bool pause = true;
    13.         int i;
    14.         fenetre.Create(sf::VideoMode(800, 600, 32), "Fenêtre SMFL", sf::Window::Fixed);
    15.         fenetre.SetBackgroundColor(sf::Color(0, 150, 0));
    16.         Fond.Create(800, 525, sf::Color(255, 255, 255));
    17.         Soleil.LoadFromFile("Images/soleil.png");
    18.         Chocobo.LoadFromFile("Images/Chocobo.png");
    19.         Chocobo.SetSmooth(false);
    20.         ChocoboSprite[0].SetImage(Chocobo);
    21.         ChocoboSprite[1].SetImage(Chocobo);
    22.         ChocoboSprite[2].SetImage(Chocobo);
    23.         ChocoboSprite[3].SetImage(Chocobo);
    24.         ChocoboSprite[0].SetSubRect(sf::IntRect(3, 110, 37, 142));
    25.         ChocoboSprite[1].SetSubRect(sf::IntRect(52, 109, 86, 141));
    26.         ChocoboSprite[2].SetSubRect(sf::IntRect(109, 110, 133, 142));
    27.         ChocoboSprite[3].SetSubRect(sf::IntRect(152, 109, 182, 141));
    28.         FondSprite.SetImage(Fond);
    29.         SoleilSprite.SetImage(Soleil);
    30.         SoleilSprite.SetLeft(732);
    31.         while (pause)
    32.         {       
    33.                 sf::Event Event;
    34.                 while (fenetre.GetEvent(Event))
    35.                 {
    36.                         if(Event.Type == sf::Event::Close)
    37.                         pause = false;
    38.                 }
    39.                 if(Horloge.GetElapsedTime() <= 1)
    40.                         i = 0;
    41.                 else if(Horloge.GetElapsedTime() <= 2 && Horloge.GetElapsedTime() > 1)
    42.                         i++;
    43.                 else if(Horloge.GetElapsedTime() <= 3 && Horloge.GetElapsedTime() > 2)
    44.                         i++;
    45.                 else if(Horloge.GetElapsedTime() <= 4 && Horloge.GetElapsedTime() > 3)
    46.                         i++;
    47.                 if(Horloge.GetElapsedTime() > 4)
    48.                 {
    49.                         Horloge.Reset();
    50.                 }
    51.                 fenetre.Draw(FondSprite);
    52.                 fenetre.Draw(SoleilSprite);
    53.                 fenetre.Draw(ChocoboSprite[i]);
    54.                 fenetre.Display();
    55.         }
    56.         return EXIT_SUCCESS;
    57. }

    Ensuite, je ne suis pas sur que mon idée de l'animation soit vraiment correct.
    De plus, si je voudrais mettre ce code dans une classe, je ne vois pas vraiment comment faire, pas vraiment l'idée =/

    Voila, si vous pouviez m'aider, cela me serait d'une grande aide,
    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      2 décembre 2007 à 12:30:05

      Essaye de déterminer où ça plante. (utilise le debbugeur)
      Pour créer un classe Animation, c'est pas trop compliqué, je te conseil de voir du côté de std::vector pour 'mémoriser' les différentes images.
      • Partager sur Facebook
      • Partager sur Twitter
        2 décembre 2007 à 12:40:38

        moi je te conseil de faire différemment au lieu de faire 4 sprite différent tu en fais un et tu modifies juste le subrect() à chaque boucle
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          2 décembre 2007 à 12:48:16

          Citation : icare14

          moi je te conseil de faire différemment au lieu de faire 4 sprite différent tu en fais un et tu modifies juste le subrect() à chaque boucle


          Mais comment tu fais pour faire une classe avec cette méthode? je vois pas trop...
          • Partager sur Facebook
          • Partager sur Twitter
            2 décembre 2007 à 15:51:19

            une image et un sprite avec un compteur qui s'active tout les tant de temps. Ensuite la méthode subrect() qui est écrit en fonction du compteur
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              2 décembre 2007 à 16:15:53

              Hum... Oui, c'est faisable. Mais ce n'est pas la même technique que la mienne. Dans la tienne, toutes les images doivent être dans le même fichier, avec la mienne : pas forcement.
              • Partager sur Facebook
              • Partager sur Twitter
                2 décembre 2007 à 17:25:55

                ouais mais dans le code qu'il montre toutes les images sont dans le même fichiers d'où ma proposition après peut être que je me trompe
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  2 décembre 2007 à 17:31:11

                  Je crois pas que tu ait la meilleur solution, mais je pense pas que moi je l'ai.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    2 décembre 2007 à 20:28:58

                    j'en sais rien (sinon je serais pas là ^^ ) mais quand je fais des animations avec SDL ou SFML j'utilise cette technique et ça marche très bien
                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 décembre 2007 à 21:11:19

                      1) soit il y a plusieurs images differentes (dans le dossier)
                      1. Animation.AddImage("anim_1.png");
                      2. Animation.AddImage("anim_2.png");
                      3. Animation.AddImage("anim_3.png");
                      4. Animation.AddImage("anim_4.png");


                      2) soit une image (dans le dossier) qui en contient plusieurs
                      1. Animation.SetImage("anim.png");
                      2. Animation.SetSubRect(30, 40); //sous-image de 30x40
                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 décembre 2007 à 21:34:41

                        Je crois avoir trouvé l'origine de ton problème:
                        1. if(Horloge.GetElapsedTime() <= 1)
                        2.                         i = 0;
                        3.                 else if(Horloge.GetElapsedTime() <= 2 && Horloge.GetElapsedTime() > 1)
                        4.                         i++;
                        5.                 else if(Horloge.GetElapsedTime() <= 3 && Horloge.GetElapsedTime() > 2)
                        6.                         i++;
                        7.                 else if(Horloge.GetElapsedTime() <= 4 && Horloge.GetElapsedTime() > 3)
                        8.                         i++;


                        je te suggère de mettre un petit std::cerr << i << std::endl après cette partie de ton code, tu verra jusqu'ou i monte en 4 secondes.
                        Parce que vu ton code actuel, a chaque tour de boucle, i est icrémenté, même si la seconde n'est pas passée. Je te suggère de remplacer tes i++ par des i=1, i=2 et i=3.

                        Dans l'espoir de t'avoir été utile,
                        Loumnam.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 décembre 2007 à 16:53:45

                          Merci, j'ai réussi a faire marché mon sprite animé
                          Manque plus que d'integrer tout ca en POO puis c'est bon =)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 décembre 2007 à 16:27:44

                            Citation : NoaX

                            Merci, j'ai réussi a faire marché mon sprite animé
                            Manque plus que d'integrer tout ca en POO puis c'est bon =)


                            fait gaffe! ce n'est pas une bonne idée de convertir un code non OO en OO
                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 décembre 2007 à 16:43:08

                              Comment dire... t'as pas l'impression de remonter un sujet résolu et clos depuis deux semaines?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 décembre 2007 à 18:22:14

                                Citation : Loumnam

                                Comment dire... t'as pas l'impression de remonter un sujet résolu et clos depuis deux semaines?


                                et alors?
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  16 décembre 2007 à 18:35:06

                                  Et alors, à partir du momment ou le créateur du topic a trouvé réponse à sa question, il vaut mieux éviter de remonter un sujet qui n'interesse plus personne. Si quelqu'un est interessé par un sujet ancien, il vaut mieux qu'il en crée un nouveau plutot qu'il le remonte.
                                  De plus, tu n'argumente absolument pas ton affirmation: "fait gaffe! ce n'est pas une bonne idée de convertir un code non OO en OO". Si tu as des éléments en faveur de cette idée, présente les, éventuellement contacte l'auteur du topic par MP, mais ne lance pas cette phrase sans autre argument, dans un sujet marqué résolu (c'est bien pour quelque chose) et vieux de deux semaines.

                                  Cordialement,
                                  Loumnam.
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  [SFML] Animé un sprite

                                  × 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