Forum de la communauté SFML

Aide => Général => Discussion démarrée par: BIOoOAG le Mars 09, 2014, 10:39:09 am

Titre: Ralentir une animation?
Posté par: BIOoOAG 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
Titre: Re : Ralentir une animation?
Posté par: G. 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é.  ;)
Titre: Re : Ralentir une animation?
Posté par: BIOoOAG le Mars 09, 2014, 11:56:00 am
ahhhh, oki, bon je vais essayer de le faire ça! :D merci
Titre: Re : Ralentir une animation?
Posté par: BIOoOAG 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!
Titre: Re : Ralentir une animation?
Posté par: G. 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)
Titre: Re : Ralentir une animation?
Posté par: linke 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
Titre: Re : Ralentir une animation?
Posté par: BIOoOAG le Mars 09, 2014, 09:08:32 pm
Ok, merci je vais essayer ta méthode. Et voir ce que ça donne!
Titre: Re : Ralentir une animation?
Posté par: BIOoOAG 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.
Titre: Re : Ralentir une animation?
Posté par: G. 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.