Last active
September 4, 2021 14:43
-
-
Save Zal0/366fd44f99583fcaffcdee038650eb83 to your computer and use it in GitHub Desktop.
C++ FSM implementation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef FSM_H | |
#define FSM_H | |
#include "Component.h" | |
ZCOMPONENT_INHERITS(FSM, Component) | |
public: | |
class State | |
{ | |
public: | |
FSM* fsm; | |
public: | |
virtual void Update() {} | |
virtual void FixedUpdate() {} | |
virtual void Exit() {} | |
}; | |
class State0Params : public State | |
{ | |
public: | |
virtual void Enter() {} | |
}; | |
template< class T > | |
class State1Param : public State | |
{ | |
public: | |
virtual void Enter(T p) = 0; | |
}; | |
template< class T0, class T1 > | |
class State2Params : public State | |
{ | |
public: | |
virtual void Enter(T0 p0, T1 p1) = 0; | |
}; | |
private: | |
State* state; | |
public: | |
ZEvent< void(State*, State*) > OnStatusChanged; | |
private: | |
void SetStateCommon(State* state); | |
public: | |
FSM(); | |
ZCOMPONENT_IMPLEMENTS_UPDATE | |
ZCOMPONENT_IMPLEMENTS_FIXED_UPDATE | |
public: | |
void SetState(State0Params* state); | |
template< class T > | |
void SetState(State1Param< T >* state, T p) | |
{ | |
State* old_state = this->state; | |
SetStateCommon(state); | |
if(state) | |
state->Enter(p); | |
OnStatusChanged(old_state, state); | |
} | |
template< class T0, class T1 > | |
void SetState(State2Params< T0, T1 >* state, T0 p0, T1 p1) | |
{ | |
State* old_state = this->state; | |
SetStateCommon(state); | |
if(state) | |
state->Enter(p0, p1); | |
OnStatusChanged(old_state, state); | |
} | |
}; | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment