Animation State

Fonctionnement:

Un state dispose de plusieurs "phase", ou "evenement".

  • Enter : Le state commence, il s'assure de jouer son animation du début.
  • End : Le state est fini, car son animation a atteint sa frame final, et ne boucle pas.
  • Exit : Le state n'est plus actif, on le quitte, certainement pour passer sur un autre.

Lorsque l'AnimationController, passe d'un state à l'autre, ces fonctions sont utilisées:

    std::function<void()> OnEnter;
    std::function<void()> OnExit;
    std::function<void()> OnEnd;

Un state est capable de récuperer le sf::IntRect actuel, la frame d'animation, présentement utilisée par l'animation qu'il joue. Lorsqu'une frame change dans l'animation, le state est prevenu par un bool. Ce signal remonte à travers l'update de l'AnimationController, jusqu'à etre visible par l'Animator, qui decide alors de transmettre ce nouveau sf::IntRect, à l'Image.


.cpp:

#include "pch.h"
#include "AnimationState.h"
#include <iostream>

namespace lg
{
    AnimationState::AnimationState(std::string _name, Animation* _animation)
        : m_name(_name), m_animation(_animation), m_isPlaying(false), m_defaultRect(sf::IntRect(0, 0, 0, 0))
    {}

    AnimationState::~AnimationState()
    {
        delete(m_animation);
    }

    std::string& AnimationState::GetName()
    {
        return m_name;
    }

    void AnimationState::SetName(std::string _name)
    {
        m_name = _name;
    }

    sf::IntRect& AnimationState::GetCurrentFrame()
    {
        if (m_animation != nullptr)
            return m_animation->GetCurrentFrame();

        return m_defaultRect;
    }

    void AnimationState::SetAnimation(Animation* _animation)
    {
        if (m_animation != nullptr)
            delete(m_animation);

        m_animation = _animation;
    }

    void AnimationState::Enter()
    {
        m_animation->Reset();
        SetPlaying(true);
    }

    void AnimationState::End()
    {
        SetPlaying(false);
    }

    void AnimationState::Exit()
    {}

    Animation* AnimationState::GetAnimation()
    {
        return m_animation;
    }

    std::shared_ptr<AnimationState> AnimationState::CreateState()
    {
        return std::shared_ptr<AnimationState>(new AnimationState());
    }

    bool AnimationState::Update()
    {
        //Est-ce que la frame a changé au cours de cette update ?
        bool frameChanged = false; //Non par defaut.
        if (m_animation != nullptr && m_isPlaying)
        {
            //L'Animation va avoir le droit d'editer ce bool
            if (m_animation->Update(frameChanged))
            {
                SetPlaying(false);
                if (OnEnd)
                    OnEnd();
            }
        }
        return frameChanged; //Et il est retourné ici
    }

    void AnimationState::SetPlaying(bool _value)
    {
        m_isPlaying = _value;
    }

    bool& AnimationState::IsPlaying()
    {
        return m_isPlaying;
    }
}