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

Auteur Sujet: 2 threads dans une classe  (Lu 3819 fois)

0 Membres et 1 Invité sur ce sujet

Mysterystem

  • Newbie
  • *
  • Messages: 9
  • Colorful Power !
    • Voir le profil
2 threads dans une classe
« le: Septembre 27, 2013, 08:16:50 pm »
Bonjour à tous !

Alors voilà mon problème : je veux gérer l'animation de la marche de mon personnage ainsi que l'animation de respiration (au repos). Le problème c'est qu'en gérant 2 threads séparés ces animations, l'animation de déplacement est en retard par rapport au moment où l'on appuie sur la touche. Et quoi que ce soit la méthode par laquelle je passe, ça ne fonctionne pas !

Sur ce, merci d'avance pour vos réponses !

Les codes que je mets ci-dessous ne sont pas complet, je mets que la partie concernée

Character.cpp
#include "Character.h"

Character::Character(): m_thread_breath(&Character::a_breath, this), m_thread_walkAnimation(&Character::a_walkAnimation, this),
    m_health(100), m_mana(50), m_class(WARRIOR), m_XperiencePoints(0), m_score(0), m_healthMAX(100), m_manaMAX(50), m_XperiencePointsMAX(150), m_cutShape(sf::Vector2i(0, 0), sf::Vector2i(32, 64)), p_isWalking(false){
    /* All is initialised */

    if(!m_texture_sprite.loadFromFile("resources\\2D\\tileset1.png"))
        std::cout << "Can't load character texture !" << std::endl;

    m_sprite.setTexture(m_texture_sprite);
    m_sprite.setTextureRect(m_cutShape);

    t_breath();
}

Character::~Character(){ /* Nothing */ }

//Animations
void Character::a_breath(){
    sf::IntRect upBreath(sf::Vector2i(0, 0), sf::Vector2i(32, 64));
    sf::IntRect downBreath(sf::Vector2i(32, 0), sf::Vector2i(32, 64));

    while(true){
        std::cout << "LOOP2" << std::endl;
        m_sprite.setTextureRect(upBreath);
        sf::sleep(sf::milliseconds(500));

        m_sprite.setTextureRect(downBreath);
        sf::sleep(sf::milliseconds(500));
    }
}

void Character::a_walkAnimation(){
    sf::IntRect frame2(sf::Vector2i(64, 0), sf::Vector2i(48, 64));
    sf::IntRect frame3(sf::Vector2i(128, 0), sf::Vector2i(48, 64));

    int speed = 50;

    if (p_isWalking){
        std::cout << "LOOP" << std::endl;

        m_sprite.setTextureRect(m_cutShape);
        sf::sleep(sf::milliseconds(speed));

        m_sprite.setTextureRect(frame2);
        sf::sleep(sf::milliseconds(speed));

        m_sprite.setTextureRect(frame3);
        sf::sleep(sf::milliseconds(speed));

        m_sprite.setTextureRect(m_cutShape);
        sf::sleep(sf::milliseconds(speed));
    }
}

void Character::t_breath(){ m_thread_breath.launch(); }
void Character::t_walkAnimation(){ m_thread_walkAnimation.launch(); }
 

Character.cpp
#ifndef CHARACTER_H_INCLUDED
#define CHARACTER_H_INCLUDED

#include <iostream>
#include <SFML/Graphics.hpp>

class Character : public sf::Drawable{
    public:
        Character();
        ~Character();

        //Animation launchers
        void t_breath();
        void t_walkAnimation();

        //Variables
        bool p_isWalking;

    private:
        //Animations
        void a_breath();
        void a_walkAnimation();

        virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const{
            target.draw(m_sprite, states);
        }

        int m_health, m_mana, m_class, m_XperiencePoints, m_score;
        int m_healthMAX, m_manaMAX, m_XperiencePointsMAX;

        sf::Texture m_texture_sprite;
        sf::Sprite m_sprite;

        sf::IntRect m_cutShape;

        sf::Thread m_thread_breath, m_thread_walkAnimation;
};

#endif // CHARACTER_H_INCLUDED
 

Game.cpp (là où se déroule toute la scène)
#include "Game.h"

Game::Game(sf::RenderWindow &screen){
    m_character.setPosition(20, screen.getSize().y - 200);

    if(!m_texture_tileset.loadFromFile("resources\\2D\\tileset1.png"))
        std::cout << "Can't load tileset !" << std::endl;

    if(!m_texture_background.loadFromFile("resources\\2D\\background.png"))
        std::cout << "Can't load background image !" << std::endl;

    m_sprite_background.setTexture(m_texture_background);
    m_sprite_background.setScale(0.653, 0.6357);
}

Game::~Game(){ /* Nothing */ }

void Game::render(sf::RenderWindow &screen){
    bool isPaused;

    sf::View camera;
    sf::View playground, shop;

    PauseScreen pause_screen(screen);

    playground = screen.getDefaultView();

//    playground.setViewport(sf::FloatRect(0, -0.9f, 2.05f, 2.05f));
    playground.setCenter(m_character.getPositionX() + 230, m_character.getPositionY() - 120);
    playground.setSize(500, 500);

    int clampX = (playground.getSize().x / 2), clampXMax = screen.getSize().x - (playground.getSize().x / 2);
    sf::Event events;

    while(screen.isOpen()){
        while(screen.pollEvent(events)){
            if(events.type == sf::Event::Closed)
                screen.close();

            if (events.type == sf::Event::LostFocus)
                isPaused = true;

            if(events.type == sf::Event::KeyPressed){
                switch(events.key.code){
                    case sf::Keyboard::Escape:
                        screen.close();
                        break;

                    case sf::Keyboard::Up:
                        //NOTHING
                        break;

                    case sf::Keyboard::Down:
                        //INTERACTION
                        break;

                    case sf::Keyboard::X:
                        //ATTACK
                        break;
                }
            }
        }

        screen.clear(sf::Color::Blue);

        if (!isPaused){
            if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){
                m_character.p_isWalking = true;
                m_character.move(-5, 0);

                if(m_character.getPositionX() < clampXMax)
                    playground.move(-5, 0);

            } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){
                m_character.p_isWalking = true;
                m_character.move(5, 0);

                if(m_character.getPositionX() > clampX)
                    playground.move(5, 0);
            } //else
//                m_character.p_isWalking = false;
        }

        screen.draw(m_sprite_background);

//        std::cout << "X : " << playground.getCenter().x << std::endl << "Y : " << playground.getCenter().y << std::endl << std::endl;

        if(m_character.getPositionX() < 0)
            m_character.setPosition(0, screen.getSize().y - 200);
        else if(m_character.getPositionX() + 32 > screen.getSize().x)
            m_character.setPosition(screen.getSize().x - 32, screen.getSize().y - 200);

        if(playground.getCenter().x < clampX)
            playground.setCenter(clampX, playground.getCenter().y);
        if(playground.getCenter().x > clampXMax)
            playground.setCenter(clampXMax, playground.getCenter().y);

        screen.draw(m_character);

        screen.setView(playground);

        if (isPaused){
            screen.setView(screen.getDefaultView());
            screen.draw(pause_screen);

            if (sf::Keyboard::isKeyPressed(sf::Keyboard::Return))
                isPaused = false;
        }

        screen.display();
    }
}
 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : 2 threads dans une classe
« Réponse #1 le: Septembre 27, 2013, 09:24:24 pm »
Tu fonces droit dans le mur avec cette façon de faire ;)

Lancer des threads à tout va pour gérer des choses en parallèle, ça n'aboutit qu'à plein de problèmes (de complexité de code d'une part, de performances d'autre part).

Gère tout dans ton thread principal, typiquement tu vas ajouter à ta classe une fonction update(sf::Time elapsed) qui va gérer l'avancement des différentes animations en fonction de l'état interne et du temps écoulé. Cf. le wiki si tu manques d'inspiration.
Laurent Gomila - SFML developer

Mysterystem

  • Newbie
  • *
  • Messages: 9
  • Colorful Power !
    • Voir le profil
Re : 2 threads dans une classe
« Réponse #2 le: Septembre 28, 2013, 10:28:14 am »
J'ai vu le tuto pour animer des sprites ! Mais je comprends pas, comment faire afficher les sprites si il n'y a pas de sf::sleep() ? Les frames d'animation vont pas passer à grande vitesse sans qu'on ne remarque rien ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : 2 threads dans une classe
« Réponse #3 le: Septembre 28, 2013, 01:58:07 pm »
Tu n'es pas obligé d'attendre activement entre deux frames, tu peux juste laisser le reste de ton programme tourner. Et lorsque le temps écoulé est suffisamment grand, là tu passes à une nouvelle frame de l'animation.
Laurent Gomila - SFML developer

Mysterystem

  • Newbie
  • *
  • Messages: 9
  • Colorful Power !
    • Voir le profil
Re : 2 threads dans une classe
« Réponse #4 le: Octobre 06, 2013, 06:17:03 pm »
Hello !

Alors après de nombreux tests j'ai pas réussi à avoir ce que je voulais, les frames n'apparaissent pas.
Donc du coup j'ai essayé avec un timer mais pas vraiment réussi à le faire non plus.

Merci d'avance !

Character.cpp
#include "Character.h"

Character::Character(): m_health(100), m_mana(50), m_class(WARRIOR), m_XperiencePoints(0), m_score(0), m_healthMAX(100), m_manaMAX(50), m_XperiencePointsMAX(150), m_currentFrame(sf::Vector2i(0, 0), sf::Vector2i(32, 64)), m_isWalking(false){
    /* All is initialised */

    if(!m_texture_sprite.loadFromFile("resources\\2D\\tileset1.png"))
        std::cout << "Can't load character texture !" << std::endl;

    m_sprite.setTexture(m_texture_sprite);
    m_sprite.setTextureRect(m_currentFrame);
}

Character::~Character(){ /* Nothing */ }

void Character::normalize(){
    m_health = m_healthMAX;
    m_mana = m_manaMAX;
    m_XperiencePoints = 0;
    m_score = 0;
}

//Animations
void Character::update(sf::Time elapsed){
    m_currentTime += elapsed;

    if (m_currentTime >= m_frameTime){


        sf::IntRect downBreath(sf::Vector2i(32, 0), sf::Vector2i(32, 64));

        sf::IntRect frame1(sf::Vector2i(0, 0), sf::Vector2i(32, 64));
        sf::IntRect frame2(sf::Vector2i(64, 0), sf::Vector2i(48, 64));
        sf::IntRect frame3(sf::Vector2i(128, 0), sf::Vector2i(48, 64));

        if (m_isWalking == false){
            std::cout << "BREATH" << std::endl;
            m_frameTime = sf::microseconds(500);

            if (m_currentFrame == frame1)
                m_currentFrame = downBreath;
            else
                m_currentFrame = frame1;
        }

        if (m_isWalking){
            std::cout << "WALKING" << std::endl;
            m_frameTime = sf::microseconds(50);

            if (m_currentFrame == frame1)
                m_currentFrame = frame2;
            else if (m_currentFrame == frame2)
                m_currentFrame = frame3;
            else if (m_currentFrame == frame3)
                m_currentFrame = frame1;
        }

        m_currentTime = sf::microseconds(m_currentTime.asMicroseconds() % m_frameTime.asMicroseconds());
    }

    m_sprite.setTextureRect(m_currentFrame);
    m_currentTime = sf::Time::Zero;
}


//Getters and Setters
void Character::setHealth(int health){
    if(health <= m_healthMAX)
        m_health = health;
}

void Character::setMana(int mana){
    if(mana <= m_manaMAX)
       m_mana  = mana;
}
void Character::setXP(int xp){
    if(xp <= m_XperiencePointsMAX)
            m_XperiencePoints = xp;
}

void Character::setClass(int Nclass){ m_class = Nclass; }
void Character::setScore(int score){ m_score = score; }

void Character::enableWalking_A(bool then){ m_isWalking = then; }

void Character::setPosition(int x, int y){
    m_sprite.setPosition(x, y);
//    m_weapon.setPosition(m_sprite.getPosition().x + 40, m_sprite.getPosition().y + 38);
//    m_armor2.setPosition(x, y);
}

void Character::move(int x, int y){
    m_isWalking = true;
    m_sprite.move(x, y);
//    m_weapon.setPosition(m_sprite.getPosition().x + 40, m_sprite.getPosition().y + 38);
//    m_armor2.amove(x, y);
}

int Character::getHealth(){ return m_health; }
int Character::getMana(){ return m_mana; }
int Character::getXP(){ return m_XperiencePoints; }
int Character::getClass(){ return m_class; }
int Character::getScore(){ return m_score; }

int Character::getPositionX(){ return m_sprite.getPosition().x; }
int Character::getPositionY(){ return m_sprite.getPosition().y; }

//Adders and Removers
void Character::addHealth(int add_health){
    int resultADD;

    resultADD = add_health + m_health;

    if(resultADD <= m_healthMAX || resultADD > 0)
        m_health += add_health;
}

void Character::addMana(int add_mana){
    int resultADD;

    resultADD = add_mana + m_mana;

    if(resultADD <= m_manaMAX || resultADD > 0)
        m_mana += add_mana;
}

void Character::addXP(int add_xp){
    int resultADD;

    resultADD = add_xp + m_XperiencePoints;

    if(resultADD <= m_XperiencePointsMAX || resultADD > 0) //We don't loose XP beacause you try and retry and you learn from your mistakes
        m_XperiencePoints += add_xp;
}

void Character::addScore(int add_score){
    int resultADD;

    resultADD = add_score + m_score;

    if(resultADD > 0)
        m_score += add_score;
}
 

Character.h
#ifndef CHARACTER_H_INCLUDED
#define CHARACTER_H_INCLUDED

#include <iostream>
#include <SFML/Graphics.hpp>

#include "Weapon.h"
#include "Armor.h"

class Character : public sf::Drawable{ //NAME : Dogwer :p
    public:
        Character();
        ~Character();

        void normalize();

        //Animations
        void update(sf::Time elapsed);

        //Enum for all
        enum p_class{WARRIOR, WIZARD, ARCHER};

        //Getters and Setters
        void setHealth(int health);
        void setMana(int mana);
        void setXP(int xp);
        void setClass(int Nclass);
        void setScore(int score);

        void enableWalking_A(bool then);

        void setPosition(int x, int y);
        void move(int x, int y);

        int getHealth();
        int getMana();
        int getXP();
        int getClass();
        int getScore();

        int getPositionX();
        int getPositionY();

        //Adders and Removers
        //-- To remove, add with the inverse
        void addHealth(int add_health);
        void addMana(int add_mana);
        void addXP(int add_xp);
        void addScore(int add_score);

    private:
        virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const{
            target.draw(m_sprite, states);
        }

        int m_health, m_mana, m_class, m_XperiencePoints, m_score;
        int m_healthMAX, m_manaMAX, m_XperiencePointsMAX;

        bool m_isWalking;

        sf::Texture m_texture_sprite;
        sf::Sprite m_sprite;

        sf::IntRect m_currentFrame;
        sf::Time m_currentTime, m_frameTime;

//        Weapon m_weapon;
//        Armor m_armor2;
};

#endif // CHARACTER_H_INCLUDED
 

scene.cpp
#include "Game.h"

Game::Game(sf::RenderWindow &screen){
    m_character.setPosition(20, screen.getSize().y - 200);

    if(!m_texture_tileset.loadFromFile("resources\\2D\\tileset1.png"))
        std::cout << "Can't load tileset !" << std::endl;

    if(!m_texture_background.loadFromFile("resources\\2D\\background.png"))
        std::cout << "Can't load background image !" << std::endl;

    m_sprite_background.setTexture(m_texture_background);
    m_sprite_background.setScale(0.653, 0.6357);
}

Game::~Game(){ /* Nothing */ }

void Game::render(sf::RenderWindow &screen){
    bool isPaused;

    sf::View camera;
    sf::View playground, shop;

    PauseScreen pause_screen(screen);

    playground = screen.getDefaultView();

//    playground.setViewport(sf::FloatRect(0, -0.9f, 2.05f, 2.05f));
    playground.setCenter(m_character.getPositionX() + 230, m_character.getPositionY() - 120);
    playground.setSize(500, 500);

    int clampX = (playground.getSize().x / 2), clampXMax = screen.getSize().x - (playground.getSize().x / 2);
    sf::Event events;

//    sf::Time frameTime, elapsedTime, actualTime;
//    sf::Clock clock;

    while(screen.isOpen()){
        elapsedTime = clock.restart();

        while(screen.pollEvent(events)){
            if(events.type == sf::Event::Closed)
                screen.close();

            if (events.type == sf::Event::LostFocus)
                isPaused = true;

            if(events.type == sf::Event::KeyPressed){
                switch(events.key.code){
                    case sf::Keyboard::Escape:
                        screen.close();
                        break;

                    case sf::Keyboard::Up:
                        //NOTHING
                        break;

                    case sf::Keyboard::Down:
                        //INTERACTION
                        break;

                    case sf::Keyboard::X:
                        //ATTACK
                        break;
                }
            }
        }

        if (!isPaused){
            m_character.enableWalking_A(false);
            if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){
                m_character.move(-5, 0);

                if(m_character.getPositionX() < clampXMax)
                    playground.move(-5, 0);

            } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){
                m_character.move(5, 0);

                if(m_character.getPositionX() > clampX)
                    playground.move(5, 0);
            }
        }

        screen.clear(sf::Color::Blue);
        m_character.update(frameTime);
        screen.draw(m_sprite_background);

//        std::cout << "X : " << playground.getCenter().x << std::endl << "Y : " << playground.getCenter().y << std::endl << std::endl;

        if(m_character.getPositionX() < 0)
            m_character.setPosition(0, screen.getSize().y - 200);
        else if(m_character.getPositionX() + 32 > screen.getSize().x)
            m_character.setPosition(screen.getSize().x - 32, screen.getSize().y - 200);

        if(playground.getCenter().x < clampX)
            playground.setCenter(clampX, playground.getCenter().y);
        if(playground.getCenter().x > clampXMax)
            playground.setCenter(clampXMax, playground.getCenter().y);

        screen.draw(m_character);

        screen.setView(playground);

        if (isPaused){
            screen.setView(screen.getDefaultView());
            screen.draw(pause_screen);

            if (sf::Keyboard::isKeyPressed(sf::Keyboard::Return))
                isPaused = false;
        }

        screen.display();

//        actualTime = clock.getElapsedTime();
//        if (actualTime - elapsedTime > 50)

    }
}
 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : 2 threads dans une classe
« Réponse #5 le: Octobre 06, 2013, 06:22:36 pm »
Citer
les frames n'apparaissent pas
Mais encore ? Peux-tu être plus précis ?

Ensuite, dans ce code on ne voit pas où est calculé frameTime. Et tu remets m_currentTime à zéro à chaque update, il ne risque pas d'aller bien loin. Il y a plein d'autres erreurs (graves ou pas) dans ton code, quelques trucs qui n'ont pas trop de sense ; tu devrais vraiment prendre le temps de comprendre tout ce que tu codes, et ne pas foncer à moitié au hasard.

Et tu es sûr que le timing de tes frames est en microsecondes ? ;)
« Modifié: Octobre 06, 2013, 06:25:02 pm par Laurent »
Laurent Gomila - SFML developer

Mysterystem

  • Newbie
  • *
  • Messages: 9
  • Colorful Power !
    • Voir le profil
Re : 2 threads dans une classe
« Réponse #6 le: Octobre 07, 2013, 04:44:16 am »
Bah pour être plus précis les frames n'apparaissent pas. Ils changent bien de texture dans Character mais on ne voit pas le changement. Et j'ai aucune idée de ce que je code, ne sachant pas vraiment où aller à partir de ce que j'ai car je l'aurais pas gérer comme ça le changement de frame (je l'aurais fait par thread personnellement) et donc du coup bah j'essaye de faire comme le code du tuto en le arrangeant à ma sauce, mais sinon voilà.

Sinon dit moi ce qui n'a pas de sens dans mon code.

Citer
Et tu remets m_currentTime à zéro à chaque update
Dans le tuto il le remettait tout le temps à zéro aussi.

Citer
dans ce code on ne voit pas où est calculé frameTime
J'avais commencé mais j'ai abandonné car au final je comprenais pas pourquoi utiliser un timer alors qu'une limite avec setFrameLimit(30) devrait faire afficher mes textures. Je comprends pas pourquoi tu disais
Citer
tu peux juste laisser le reste de ton programme tourner
alors que si rien ne l'arrête quelques millisecondes bah mes textures n'apparaissent pas... J'ai mal compris un truc quelque part ou bien ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : 2 threads dans une classe
« Réponse #7 le: Octobre 07, 2013, 07:49:43 am »
Non mais là sérieusement, on va y passer des jours. Tu veux vraiment qu'on te ponde une solution que tu ne vas qu'à moitié comprendre, puis revenir dans quelques jours parce que tu auras un nouveau problème avec ce même code que tu ne comprends toujours pas ? Ou bien tu veux essayer d'apprendre à ton rythme et comprendre ce que tu codes ? :-\
Laurent Gomila - SFML developer

Mysterystem

  • Newbie
  • *
  • Messages: 9
  • Colorful Power !
    • Voir le profil
Re : 2 threads dans une classe
« Réponse #8 le: Octobre 07, 2013, 07:48:01 pm »
Je savais que t'allais me répondre ça ^^

Nan je veux comprendre mais je pige rien car je sais pas pourquoi on utilise pas les threads et pourquoi ma solution marche pas, enfin j'ai pas l'impression que j'aboutirais quelque part avec ce que je code et j'ai pas très envie de copier-coller les codes qu'il y a dans le tuto...

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : 2 threads dans une classe
« Réponse #9 le: Octobre 07, 2013, 08:45:28 pm »
Citer
Je savais que t'allais me répondre ça ^^
;D

Dans ce cas peut-être devrais-tu creuser ton idée avec les threads, et voir où ça te mène. Parfois il vaut mieux aller au bout de ses idées et se rendre compte par soi-même, plutôt que de suivre aveuglément des conseils qu'on ne comprend pas.

Mais garde quand même en tête qu'au final ça ne sera pas la solution ultime, et qu'il faudra l'oublier vite fait ;)
Laurent Gomila - SFML developer

Mysterystem

  • Newbie
  • *
  • Messages: 9
  • Colorful Power !
    • Voir le profil
Re : 2 threads dans une classe
« Réponse #10 le: Octobre 31, 2013, 04:26:20 pm »
Hello ! J'ai réussi au final, j'ai trouvé un moyen d'avoir un code qui fonctionne et tout, c'est parfait maintenant ^^
Merci de m'avoir mené sur le droit chemin ;)

Le code pour ceux que ça intéresse :
void Character::update(sf::Time elapsed){
    m_currentTime += elapsed;

    sf::IntRect downBreath(sf::Vector2i(32, 0), sf::Vector2i(32, 64));

    sf::IntRect frame1(sf::Vector2i(0, 0), sf::Vector2i(32, 64));
    sf::IntRect frame2(sf::Vector2i(64, 0), sf::Vector2i(48, 64));
    sf::IntRect frame3(sf::Vector2i(128, 0), sf::Vector2i(48, 64));

    if (m_currentTime >= sf::milliseconds(500)){
        m_currentTime = sf::Time::Zero;

        if (m_isWalking == false){
            //std::cout << "BREATH" << std::endl;
            m_idFrame[0]++;

            if(m_idFrame[0] == 2)
            m_idFrame[0] = 0;

            if (m_idFrame[0] == 0)
                m_currentFrame = frame1;
            else if (m_idFrame[0] == 1)
                m_currentFrame = downBreath;
        }

        if (m_isWalking){
            //std::cout << "WALKING" << std::endl;

            if(m_idFrame[1] == 3)
                m_idFrame[1] = 0;

            if (m_idFrame[1] == 0)
                m_currentFrame = frame2;
            else if (m_idFrame[1] == 1)
                m_currentFrame = frame3;
            else
                m_currentFrame = frame1;

            m_idFrame[1]++;
        }
    }

    std::cout << "ID : " << m_idFrame[0] << std::endl;

    m_sprite.setTextureRect(m_currentFrame);
}

 

anything