void SetPreviousState(BaseState
{
m_pPreviousState = s;
}
////////////////////////////////////////////////////////////////////
///@brief 更新状态
///
///@return 无返回值
////////////////////////////////////////////////////////////////////
void Update()const
{
if (m_pGlobalState)
{
m_pGlobalState->Execute(m_pOwner);
}
if (m_pCurrentState)
{
m_pCurrentState->Execute(m_pOwner);
}
}
////////////////////////////////////////////////////////////////////
///@brief 改变状态
///@param [in]s 要设置的状态
///@return 无返回值
////////////////////////////////////////////////////////////////////
void ChangeState(BaseState
{
//assert(PNewState && "
///保留前一个状态记录
m_pPreviousState = m_pCurrentState;
///调用现有状态的退出方法
m_pCurrentState->Exit(m_pOwner);
///改变到一个新状态
m_pCurrentState= pNewState;
///调用新状态的进入方法
m_pCurrentState->Enter(m_pOwner);
}
////////////////////////////////////////////////////////////////////
///@brief 改变到上一状态
///
///@return 无返回值
////////////////////////////////////////////////////////////////////
void RevertToPreviousState()
{
ChangeState(m_pPreviousState);
}
////////////////////////////////////////////////////////////////////
///@brief 查看当前状态
///
///@return BaseState
////////////////////////////////////////////////////////////////////
BaseState
{
return m_pCurrentState;
}
////////////////////////////////////////////////////////////////////
///@brief 查看全局状态
///
///@return BaseState
////////////////////////////////////////////////////////////////////
BaseState
{
return m_pGlobalState;
}
////////////////////////////////////////////////////////////////////
///@brief 查看前一状态
///
///@return BaseState
////////////////////////////////////////////////////////////////////
BaseState
{
return m_pPreviousState;
}
//class passed as a parameter.
bool isInState(const BaseState
{
return typeid(*m_pCurrentState) == typeid(st);
}
};
#endif // !BASESTATEMACHINE_H
这个是状态机的基类,使用的时候只需要在每个具体实例中申明一个状态机的类,然后完成自己的状态类的填写,即可完成一个高质量的状态机。注释很全有中文的也有英文的,有兴趣的童鞋可以讨论下这个设计是否合理。