Pre nekoliko godina sam naucio nacin implementiranja state masine 'od nule' putem nasledjivanja ( koristio sam je u svojoj video igri )
Evo primera:
class Actor;
class State;
class Actor
{
public:
void changeState(State * pState)
{
if(m_pCurrentState)
{
m_pCurrentState->exit(this);
m_pCurrentState = pState;
m_pCurrentState->enter(this);
}
}
void update(float dt)
{
m_pCurrentState->update(this, dt);
}
State * m_pCurrentState;
}
class State
{
public:
virtual void enter(Actor * pActor);
virtual void update(Actor * pActor);
virtual void exit(Actor * pActor);
};
class MainPlayerStandingState;
class MainPlayerMoveState : public State
{
public:
virtual void enter(Actor * pActor)
{
pActor->setVelocity(2);
}
virtual void update(Actor * pActor, float dt)
{
pActor->move(dt);
if(pActor->pos < 0)
{
pActor->changeState(MainPlayerStandingState::instance());
}
}
virtual void exit(Actor * pActor)
{
pActor->setVelocity(0);
}
static MainPlayerMoveState & instance()
{
static MainPlayerMoveState state;
return state;
}
};
Meni se ovaj pristup dopada, naravno, mana je sto za svaki objekat i za svaki state objekta treba napraviti novu klasu ali to se da resiti skriptovanjem :)
Vidim da boost nudi state_chart, drugaciji pristup implementiranja state machine ali me odbija kompleksnost koda i, posebno, otkrivanje gresaka ( verovatno zato sto ne poznajem dovoljno templates ali planiram da ih izucim ).
Takodje, u boostu postoje events, transitions.
Posto ja zelim da koristim prethodno navedeni nacin implementacije state machine a ne sa boost, zanima me kako se moze unaprediti postojeci kod da koristi te evente, transitions, ako su mi uopste potrebni. Ako nije dovoljno jasno, mogu uploadovati primer da se bolje razume.
Verovatno postoji jos mnogo biblioteka koje nude state machine funkcionalnost ali bih ja voleo da se napravi funkcionalnost na ovaj nacin i da se sve to spakuje u biblioteku koju mozemo svi koristiti :)
Problem sa gomilanjem klasa se moze resiti integrisanjem Lua ili bilo kog script jezika u biblioteku. Mislim da je ovo jednostavan i elegantan nacin da se dobije mocna funkcionalnost state machine.