Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Ralentir une animation?  (Lu 4197 fois)

0 Membres et 1 Invité sur ce sujet

BIOoOAG

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Ralentir une animation?
« le: Mars 09, 2014, 10:39:09 am »
Bonjour à tous,

j'ai réussi à faire une animation avec un sprite, cependant celle-ci va à 3000 à l'heure(pas dans le déplacement du sprite, mais dans la lecture du sprite), il y a un moyen de limiter le vitesse de l'animation?


mon code pour l'animation :


      sf::Texture perso;
     sf::Sprite sprite_perso;
enum Dir{Down, Left, Right, Up};
sf::Vector2i anim(1, Down);
bool updateFPS =true;

Main {...



//Chargement de la texture
        if (!perso.loadFromFile("player.png"))
        {
                std::cout << "Erreur chargement perso" ;
        }

        sprite_perso.setTexture(perso);

       anim.x++;

        if(anim.x *32 >= perso.getSize().x)
        {
                anim.x = 0;
        }
        sprite_perso.setTextureRect(sf::IntRect(anim.x * 32, anim.y * 32, 32, 32));
        window.draw(sprite_perso);
}

Merci d'avance
BIOoOAG
« Modifié: Mars 11, 2014, 08:49:56 pm par BIOoOAG »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Ralentir une animation?
« Réponse #1 le: Mars 09, 2014, 11:41:27 am »
Bah ouai, au lieu de faire anim.x++ à chaque frame, fais le juste quand un certain temps est écoulé.  ;)

BIOoOAG

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : Ralentir une animation?
« Réponse #2 le: Mars 09, 2014, 11:56:00 am »
ahhhh, oki, bon je vais essayer de le faire ça! :D merci

BIOoOAG

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : Ralentir une animation?
« Réponse #3 le: Mars 09, 2014, 06:28:33 pm »
Re,

alors j'ai essayé avec les clock, mais c'est trop "aléatoire", car je le mets dans ma boucle while window is open en gros,
je cherche du coup comment savoir le frame rate, je n'ai pas trouvé de getFramerate, une idée, mais ça sera aussi "aléatoire",
Vous aurez un moyen de déclancher les phases de l'animation quand on veut de façon fixe?

Merci d'avance!

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Ralentir une animation?
« Réponse #4 le: Mars 09, 2014, 07:32:27 pm »
Pour calculer le frame rate, c'est le dernier code dans le tutoriel : http://www.sfml-dev.org/tutorials/2.1/system-time-fr.php
Le framerate (fps) c'est l'inverse du temps (en secondes) écoulé en une frame.

Comment ça aléatoire ?
Comment ça "de façon fixe" ?
Sinon dans le wiki y'a des exemples de classes d'animations, ça peut aider à faire la tienne. (ou à utiliser la leur)

linke

  • Newbie
  • *
  • Messages: 17
    • Voir le profil
Re : Ralentir une animation?
« Réponse #5 le: Mars 09, 2014, 08:34:34 pm »
salut  8)
lis attentivement ce bout de code

float image_count= 0, image_change= 100, image_v= 500;
sf::Clock clock;
image_count+= image_v* clock.restart().asSeconds();
        if(image_count>= image_change){
            image_count= 0;
            //source.x++;
            if((source.x * 32) >= pTexture.getSize().x)
                source.x = 0;
        }
 

on variant le image_v on peut ralentir ou accélérer , c'et ce qu'on a appelle un facteur de temps

BIOoOAG

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : Ralentir une animation?
« Réponse #6 le: Mars 09, 2014, 09:08:32 pm »
Ok, merci je vais essayer ta méthode. Et voir ce que ça donne!

BIOoOAG

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : Ralentir une animation?
« Réponse #7 le: Mars 11, 2014, 08:47:35 pm »
Re, j'ai pu y toucher un peu ce soir et de changer image_v ne change rien mon perso à toujours une anim à 3000 à l'heure!
Je vous donne mon code, si vous pouvez m'aider.

sf::Texture perso;
sf::Sprite sprite_perso;

enum Dir{Down, Left, Right, Up};
sf::Vector2i anim(1, Down);
bool updateFPS =true;

Main{...
        sf::Clock time;
        float   fpsCount = 0,
                        switchFps = 100,
                        fpsSpeed = 500;
// J'ai un peu allégé le code.
//Chargement de la texture

        if (!perso.loadFromFile("player.png"))
        {
                std::cout << "Erreur chargement perso" ;
        }

        sprite_perso.setTexture(perso);
        while (window.isOpen())
        {
                sf::Event event;
                while (window.pollEvent(event))
                {
                        if (event.type == sf::Event::Closed)
                                window.close();
                }
       



                if (updateFPS)
                {
                        fpsCount += fpsSpeed * time.restart().asSeconds();
                        std::cout << fpsCount;
                }
                else
                        fpsCount = 0;

                if (fpsCount >= switchFps)
                {
                                anim.x++;
                                // getSize().x donne la largeur de la texture
                                if(anim.x *32 >= perso.getSize().x)
                                {
                                        anim.x = 0;
                                }

                }
       
                sprite_perso.setTextureRect(sf::IntRect(anim.x * 32, anim.y * 32, 32, 32));
                window.draw(sprite_perso);

}
       

Merci d'avance.
« Modifié: Mars 11, 2014, 08:50:19 pm par BIOoOAG »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Ralentir une animation?
« Réponse #8 le: Mars 11, 2014, 09:14:51 pm »
Faut que tu remettes fpsCount à 0 de temps en temps. Genre quand ton animation "avance". ;)
T'as même mis un cout de fpsCount donc t'aurais pu remarquer qu'une fois > switchFps il l'était tout le temps.

 

anything