Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gerer une animation[SFML]

sprite a plusieurs images...

    6 février 2008 à 3:27:24

    Salut, j'ai creer une classe pour gerer le deplacement de mon sprite(en l'occurance, le grand megaman X :) ) mais je suis bloqué au niveau du "changement d'image".Je n'ai jamais vraiment fait ca avant et je ne trouve pas le moyen de continuer. j'ai toutefois ete capable de creer une methode pour "faire l,Inventaire" de tous mes fichier png qui servent à faire l'anim, me reste plus qu'a les enchainé et c'est la que je bloque...

    ps.Je sais...tableau de string initialiser avec variable...et si je part mal, donner moi des pistes svp :euh:

    le tout apparaiterai dans une boucle while du main losque X touche est enfoncé

    1. #include <SFML/System.hpp>
    2. #include <SFML/Graphics.hpp>
    3. #include <iostream>
    4. #include <string>
    5. #include <sstream>
    6. #include "Run.h"
    7. using namespace std;
    8.     Run::Run (int numbOfPic, string pathName, string fileType) : m_numberOfImages(numbOfPic), m_nameofImages(pathName)
    9.     {
    10.         string ImgPath[numbOfPic];
    11.         for (int i= 0 ; i < numbOfPic ; i++)
    12.         {
    13.             ImgPath[i] = pathName;                   //Ici, je deresse dans un tableau dynamique mes fichier image necessaire a l'animation
    14.             stringstream(ImgPath[i]) << i;
    15.             stringstream(ImgPath[i]) << fileType;
    16.         }
    17.     }
    18.     int Run::ChangeImage(sf::Image& Previous,float Time)
    19.     {
    20.         ElapsedTime =Time;
    21.        for(int i = 0 ; i < 10 ; i++)     //Bloquage, comment enchainer ces images avec x nombres de secondes? De facons qu'une fois completer, la boucle recommence du debut?
    22.        {
    23.        }
    24.     }

    EDIT : en gros, comment faire pour que mes images s'enchaine selon le temps?
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      7 février 2008 à 17:35:58

      Pose toi les bonnes questions ;) :

      -> Comment garder en mémoire les images nécessaire à l'animation?
      -> Comment garder en mémoire le temps que doit être affichée chaque image (pas forcément le même)?
      -> Comment faire pour avoir une horloge "interne" ( = propre à l'objet ) ?
      -> Comment faire pour avoir une seule fonction d'affichage ( ex. Draw(screen) ) ? [ Sans avoir de fonction "changerImage", ou je ne sais pas quoi. ]

      Une question "bonus" :
      Si il y a trop d'images, comment faire pour ne pas toutes les charger en mémoire en même temps? [ Économie de mémoire, sans perte de performance. ]
      • Partager sur Facebook
      • Partager sur Twitter
        8 février 2008 à 4:08:51

        Merci pour l'orientation, J,ai beacoup progressé depuis les derniers jours, j'en suis rendu à la question 3 et 4 qui sont, a mon avis, intrinsectement liées :p .
        j'ai pensé faire une horloge interne propre au "programme", qui se reseterais selon chaque ratios (nombred'image/ratio) quand une boucle for passerais...mais je n'avais pas vu une horloge pour chaque objet :). ceci voudrais dire que l,Objet contenu dans mon tableau de vecteur(question 1 ;) ) contiendrait une variables stockant...l'objet avant lui. Pour reprendre au compteur ou son predesesseur a arreter...et de la...je ferais une boucle for que lorsque mon tableau est parcouru, on reprend depuis le debut avec un clock reseté à 0:):):)

        presentement 10:10 du soir, j'ai une reserve de café pour encore 6 heures et des cours a 4h demain alors happy codage pour moi:)

        Giga merci pour ta reponse, elle repond mieux a mon casse tete de ratio et de boucle for combiné au ratio :)
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          8 février 2008 à 7:55:42

          Alors, je ne suis pas sûr d'avoir compris ce que tu veux faire avec une boucle for, mais ça ne me semble pas terrible, ni nécessaire. Avec la SFML, il y a sf::Clock.

          Enfait, je viens de réaliser que j'ai oublié une question assez importante (mais plus ou moins implicite) :
          -> Comment mémoriser quelle image est entrain de se faire afficher? (Comment avoir un "marque image" dans notre tableau?)

          Ravi de t'aider! ;)
          • Partager sur Facebook
          • Partager sur Twitter
            8 février 2008 à 21:27:48

            je te donne un croquis pour te donner une idee de comment je ferais:
            1. class Anim : public sf::Sprite, private sf::Thread
            2. {
            3. public:
            4.         Anim(float ImagePerSec) :
            5.                         myImagePerSec(ImagePerSec)
            6.         {
            7.                 Launch();
            8.         }
            9.         virtual void Run(void)
            10.         {
            11.                 SetImage(myImages[static_cast<int>(myClock.GetElapsedTime() * myImagePerSec) % myImages.size());
            12.         }
            13. private:
            14.         std::vector<sf::Image> myImages;
            15.         sf::Clock myClock;
            16.         float myImagePerSec;
            17. };
            • Partager sur Facebook
            • Partager sur Twitter
              10 février 2008 à 10:22:03

              Humm...j'ai pas bien compris
              tu fais un modulo pour savoir quel sprite afficher dans tn vecteur?
              je ne comprend pas grand chose au modulo.... :euh:
              mais a ce qu j'en comprend, il donne un nombre entier selon (nb de secondes * lenombredefpsquejeveu) % tailledutableau et c'est ca que je recherchais avec l'histoire de ma boucle for, mais qui etait un peu trp tiré par les cheveux.

              et en passant, j'utilise la meme image avec des path differentes pour initialiser mes sprites...j'ai penser que ca creerais une fuite de memoire, mais si je supprimedetruis les images les sprites partiront avec non?
              et mon marquer de tableau preferer a moi est la variable i pour repondre à hiura :p enfin...quand c'est faisable...ET MERCI POUR VOS REPONSES
              • Partager sur Facebook
              • Partager sur Twitter
                12 février 2008 à 19:57:24

                ne serait-il pas plus simple de faire une boucle qui translate chaques images à chaque x secondes dans une boucle?
                J'ai bien peur de ne pas etre assez à l'aise avec le modulo pour faire ce que tu me propose chlab... :-°
                • Partager sur Facebook
                • Partager sur Twitter

                Gerer une animation[SFML]

                × 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