Skip to content

Instantly share code, notes, and snippets.

@Zal0
Last active September 4, 2021 14:43
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Zal0/366fd44f99583fcaffcdee038650eb83 to your computer and use it in GitHub Desktop.
Save Zal0/366fd44f99583fcaffcdee038650eb83 to your computer and use it in GitHub Desktop.
C++ FSM implementation
#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