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