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

Auteur Sujet: [Résolu] Animation qui s'accélère (ce que je ne veux pas)  (Lu 1660 fois)

0 Membres et 1 Invité sur ce sujet

eldoir

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
[Résolu] Animation qui s'accélère (ce que je ne veux pas)
« le: Décembre 09, 2014, 05:47:04 am »
Bonsoir,

J'ai inclus ceci dans mon projet afin de faire tourner des animations basiques ->https://github.com/SFML/SFML/wiki/Source:-AnimatedSprite

Voici donc mon main :

#include "AnimatedSprite.hpp"

using namespace std;
using namespace sf;

int main() {
   
    srand((int)time(NULL));
   
    int current_drop = 0;
    float drop[] = {5.5, 10.3, 11.3, 19.9, 26.7, 27.7, 35.8, 37.9, 43.3, 48.0};
   
    VideoMode screen = VideoMode::getDesktopMode();
   
    ContextSettings settings;
    settings.antialiasingLevel = 8;
   
    RenderWindow window(VideoMode(SCREEN_WIDTH, SCREEN_HEIGHT), "DAREDEWILL", Style::Default, settings);
    window.setFramerateLimit(60);
    // On centre la fenêtre sur l'écran quelle que soit sa taille
    window.setPosition(Vector2i((screen.width-SCREEN_WIDTH)/2, (screen.height-SCREEN_HEIGHT)/2));

    Texture dropTexture;
    if (!dropTexture.loadFromFile("img/drop.png")) {
        cerr << "Impossible de charger l'animation drop.png !" << endl;
        return EXIT_FAILURE;
    }
   
    Animation dropAnim;
    dropAnim.setSpriteSheet(dropTexture);
    dropAnim.addFrame(IntRect(0, 0, 34, 34));
    dropAnim.addFrame(IntRect(34, 0, 34, 34));
    dropAnim.addFrame(IntRect(68, 0, 34, 34));
    dropAnim.addFrame(IntRect(102, 0, 34, 34));
   
    Animation* currentAnimation = &dropAnim;
   
    AnimatedSprite animatedDrop(sf::seconds(25), false, false);
   
    Clock clock;
    Time currentTime;
   
    while (window.isOpen()) {
       
        currentTime = clock.getElapsedTime();
       
        Event event;
       
        while (window.pollEvent(event)) {
           
            if(event.type == Event::Closed) {
                window.close();
            } else if (event.type == Event::KeyPressed) {
               
                switch(event.key.code) {
                    case Keyboard::Escape: window.close();
                        break;
                    default:
                        break;
                }
            }
        }
       
       
        if (current_drop < 10 && currentTime.asSeconds() > drop[current_drop]) {
            animatedDrop.setPosition(sf::Vector2f(rand()%SCREEN_WIDTH, rand()%SCREEN_HEIGHT));
            animatedDrop.play(*currentAnimation);
            current_drop++;
        }
       
        window.clear(Color::Black);
       
        animatedDrop.update(currentTime);
       
        window.draw(animatedDrop);

        window.display();
    }
   
    return EXIT_SUCCESS;
}
 

Le but est de jouer une animation à un moment précis (ces moments sont stockés dans un tableau au début du main et correspondent à des secondes, si vous avez une meilleure implémentation à proposer je suis preneur ^^ )

Le truc, c'est que mon animation s'accélère à chaque fois que je la play...

De plus, je ne comprends pas pourquoi même si je précise 25 secondes entre chaque frame lorsque je l'instancie,  elle est en réalité beaucoup plus rapide (moins d'une seconde) !

J'ai beau lire le code le code Laurent Gomila dans AnimatedSprite.cpp, je ne vois pas où ça pèche...

Quelqu'un aurait-il une idée ? Merci d'avance ;)

P.S : J'ai sinon entendu dire que Thor serait une meilleure solution pour les animations, mais si je comprends bien, étant avec SFML 2.1 je ne peux pas me servir de la dernière version de Thor qui est la 2.0, je dois me contenter de la 1.1 qui est assez vieille donc ça m'embête un peu...
« Modifié: Décembre 09, 2014, 10:39:10 pm par eldoir »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Animation qui s'accélère (ce que je ne veux pas)
« Réponse #1 le: Décembre 09, 2014, 05:05:21 pm »
A première vue currentTime  est de plus en plus grand car tu ne restart nul part ta clock.
T'es censé donner à ta fonction update la durée d'une seule frame, là tu donnes le temps écoulé depuis que la clock a été crée (depuis le début donc).
« Modifié: Décembre 09, 2014, 08:30:20 pm par G. »

eldoir

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re : Animation qui s'accélère (ce que je ne veux pas)
« Réponse #2 le: Décembre 09, 2014, 10:38:51 pm »
Ah oui suis-je bête, 1 ligne et c'est corrigé pff ^^

Merci bien !