简单的状态机:
event:外界的事件
condition:条件
state:状态
三者关系:外界的event构成一个state所需要的条件
state1与state2之间如果能进行跃迁(前提条件),那么state1->state2需要的condition2条件必须满足(当外界给予的事件组成的条件正好是state2所需要的条件condition2就自动跃迁)
// 初始化跃迁条件
m_vecConditions.resize(eFsmCondition_Amount);
// 直接构造数据
{
// 空条件
FSMCondition* pCondition = new FSMCondition(eFsmEvent_Amount);
m_vecConditions[eFsmCondition_None] = pCondition;
}
{
// 攻击条件
FSMCondition* pCondition = new FSMCondition(eFsmEvent_Amount);
pCondition->AttachEvent(eFsmEvent_Click);// eFsmEvent_Click 鼠标点击事件
m_vecConditions[eFsmCondition_Attack] = pCondition;
}
{
// 攻击结束条件
FSMCondition* pCondition = new FSMCondition(eFsmEvent_Amount);
pCondition->AttachEvent(eFsmEvent_AnimOver);
m_vecConditions[eFsmCondition_AttackFinish] = pCondition;
}
{
// 移动条件
FSMCondition* pCondition = new FSMCondition(eFsmEvent_Amount);
pCondition->AttachEvent(eFsmEvent_Keyboard);
m_vecConditions[eFsmCondition_Move] = pCondition;
}
{
// 死亡条件
FSMCondition* pCondition = new FSMCondition(eFsmEvent_Amount);
pCondition->AttachEvent(eFsmEvent_MsgDie);
m_vecConditions[eFsmCondition_Die] = pCondition;
}
{
// 复活条件
FSMCondition* pCondition = new FSMCondition(eFsmEvent_Amount);
pCondition->AttachEvent(eFsmEvent_MsgRevive);
m_vecConditions[eFsmCondition_Revive] = pCondition;
}
{
// 跑步条件
FSMCondition* pCondition = new FSMCondition(eFsmEvent_Amount);
pCondition->AttachEvent(eFsmEvent_Keyboard);
pCondition->AttachEvent(eFsmEvent_Shift);
m_vecConditions[eFsmCondition_Run] = pCondition;
}
{
// 移动攻击条件
FSMCondition* pCondition = new FSMCondition(eFsmEvent_Amount);
pCondition->AttachEvent(eFsmEvent_Keyboard);
pCondition->AttachEvent(eFsmEvent_Click);
m_vecConditions[eFsmCondition_MoveAttack] = pCondition;
}
{
// 移动攻击结束条件
FSMCondition* pCondition = new FSMCondition(eFsmEvent_Amount);
pCondition->AttachEvent(eFsmEvent_Keyboard);
pCondition->AttachEvent(eFsmEvent_AnimOver);
m_vecConditions[eFsmCondition_MoveAttackFinish] = pCondition;
}
{
// 跑步攻击条件
FSMCondition* pCondition = new FSMCondition(eFsmEvent_Amount);
pCondition->AttachEvent(eFsmEvent_Keyboard);
pCondition->AttachEvent(eFsmEvent_Click);
pCondition->AttachEvent(eFsmEvent_Shift);
m_vecConditions[eFsmCondition_RunAttack] = pCondition;
}
{
// 跑步攻击结束条件
FSMCondition* pCondition = new FSMCondition(eFsmEvent_Amount);
pCondition->AttachEvent(eFsmEvent_Keyboard);
pCondition->AttachEvent(eFsmEvent_Shift);
pCondition->AttachEvent(eFsmEvent_AnimOver);
m_vecConditions[eFsmCondition_RunAttackFinish] = pCondition;
}
// 初始化状态
m_vecStates.resize(eFsmState_Amount);
for (int i = 0; i < eFsmState_Amount; i++)
{
m_vecStates[i] = new FSMState(i);
}
{
// 闲置状态,可跃迁至:死亡、跑步、移动、攻击
RegistTransition(eFsmState_Idle, eFsmState_Die, eFsmCondition_Die);
/*
void FSM::RegistTransition(unsigned int nSrcStateID, unsigned int nDstStateID, unsigned int nCondisionID)
{
m_vecStates[nSrcStateID]->AddTransition(m_vecConditions[nCondisionID], m_vecStates[nDstStateID]);
}
void FSMState::AddTransition(FSMCondition* pCondition, FSMState* pFSMState)
{
m_vecTargetState.push_back(pFSMState);
m_vecTargetCondition.push_back(pCondition);
}
FSMState* FSMState::Transition(FSMCondition* pCondition)
{
for (unsigned int i = 0; i < m_vecTargetCondition.size(); i++)
{
if (m_vecTargetCondition[i]->IsSubSetOfCondition(pCondition))
{
return m_vecTargetState[i];
}
}
return this;
}
bool FSMCondition::IsSubSetOfCondition(FSMCondition* pCondition)
{
const unsigned char* pMask = pCondition->GetMaskBuffer();
for (unsigned int i = 0; i < m_nMaskLength; i++)
{
if ((m_pMask[i] & pMask[i]) != m_pMask[i])
{
return false;
}
}
return true;
}
*/
RegistTransition(eFsmState_Idle, eFsmState_Run, eFsmCondition_Run);
RegistTransition(eFsmState_Idle, eFsmState_Move, eFsmCondition_Move);
RegistTransition(eFsmState_Idle, eFsmState_Attack, eFsmCondition_Attack);
}
{
// 攻击状态,可跃迁至:死亡、闲置
RegistTransition(eFsmState_Attack, eFsmState_Die, eFsmCondition_Die);
RegistTransition(eFsmState_Attack, eFsmState_Idle, eFsmCondition_AttackFinish);
}
{
// 移动状态,可跃迁至:死亡、跑步攻击、移动攻击、跑步、闲置
RegistTransition(eFsmState_Move, eFsmState_Die, eFsmCondition_Die);
RegistTransition(eFsmState_Move, eFsmState_RunAttack, eFsmCondition_RunAttack);
RegistTransition(eFsmState_Move, eFsmState_MoveAttack, eFsmCondition_MoveAttack);
RegistTransition(eFsmState_Move, eFsmState_Run, eFsmCondition_Run);
RegistTransition(eFsmState_Move, eFsmState_Move, eFsmCondition_Move);
RegistTransition(eFsmState_Move, eFsmState_Idle, eFsmCondition_None);
}
{
// 死亡状态,可跃迁至:闲置
RegistTransition(eFsmState_Die, eFsmState_Idle, eFsmCondition_Revive);
}
{
// 移动攻击状态,可跃迁至:死亡、跑步、移动、闲置
RegistTransition(eFsmState_MoveAttack, eFsmState_Die, eFsmCondition_Die);
RegistTransition(eFsmState_MoveAttack, eFsmState_Run, eFsmCondition_RunAttackFinish);
RegistTransition(eFsmState_MoveAttack, eFsmState_Move, eFsmCondition_MoveAttackFinish);
RegistTransition(eFsmState_MoveAttack, eFsmState_Idle, eFsmCondition_AttackFinish);
}
{
// 跑步状态,可跃迁至:死亡、跑步攻击、移动、闲置
RegistTransition(eFsmState_Run, eFsmState_Die, eFsmCondition_Die);
RegistTransition(eFsmState_Run, eFsmState_RunAttack, eFsmCondition_RunAttack);
RegistTransition(eFsmState_Run, eFsmState_Run, eFsmCondition_Run);
RegistTransition(eFsmState_Run, eFsmState_Idle, eFsmCondition_None);
}
{
// 跑步攻击状态,可跃迁至:死亡、跑步、移动、闲置
RegistTransition(eFsmState_RunAttack, eFsmState_Die, eFsmCondition_Die);
RegistTransition(eFsmState_RunAttack, eFsmState_Run, eFsmCondition_RunAttackFinish);
RegistTransition(eFsmState_RunAttack, eFsmState_Move, eFsmCondition_MoveAttackFinish);
RegistTransition(eFsmState_RunAttack, eFsmState_Idle, eFsmCondition_AttackFinish);
}