状态机


简单的状态机:

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);
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值