Example #1
0
void StateProduce::Update( float dt, SelectableObject* pOwner )
{
	assert(pOwner->GetType() == eObjectType_Building);

	Building* pObj = static_cast<Building*>(pOwner);
	float fProgress = pObj->GetCurProgress();
	const STRING& unitName = pOwner->GetActiveAbility()->m_param;
	SUnitData* unitData = &GameDataDefManager::GetSingleton().m_unitData[unitName];
	float timeCost = Ogre::StringConverter::parseReal(unitData->params["timecost"]);

	if (fProgress > timeCost)
	{
		//生产完毕
		pOwner->GetAi()->SetCurState(eObjectState_Idle);

		//鲜活的单位出炉了
		Unit* pUnit = static_cast<Unit*>(ObjectManager::GetSingleton().CreateObject(eObjectType_Unit));
		pUnit->setParameter("name", unitName);
		pUnit->Init();
		pUnit->SetPosition(pObj->GetRallyPoint());
		pUnit->AddComponent(eComponentType_Path, new PathComponent(pUnit));

		//新单位进入空闲状态
		pUnit->GetAi()->SetCurState(eObjectState_Idle);
	}
}
Example #2
0
void StateStop::Update( float dt, SelectableObject* pOwner )
{
	assert(pOwner->GetType() == eObjectType_Unit);

	Unit* pUnit = static_cast<Unit*>(pOwner);
	float fPastTime = pUnit->GetStopTime() + dt;
	pUnit->SetStopTime(fPastTime);

	const float STOP_TIME = 0.2f;
	if (fPastTime > STOP_TIME)
	{
		//进入空闲状态
		pUnit->GetAi()->SetCurState(eObjectState_Idle);
	}
}
Example #3
0
void aiBehaviorMoveToBase::Execute( Ogre::Any& owner )
{
	Unit* pUnit = Ogre::any_cast<Unit*>(owner);
	AiComponent* pAi = pUnit->GetAi();
	PathComponent* path = pUnit->GetPath();

	POS target = pAi->GetFaction()->GetBase()->GetPosition();

	if(path->FindPath(target, true))
	{
		path->SetDestPos(target);
		bool bSucceed = path->FindPath(target, false);
		assert(bSucceed);
		pUnit->GetAnim()->PlayAnimation(eAnimation_Move, true);
	}
}