青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 72,  comments - 4,  trackbacks - 0
泰坦之旅的ai

titan quest的AI用的是切換式的狀態機,而尋路用的是path engine第3方庫,游戲中有一個任務編輯器主要是生成每一個任務,每個任務中可以生成多個觸發器(trigger),每個觸發器可以生成一系列條件(condition),并可生成條件成立時要觸發的動作(action). 這個有點類似war3的事件編輯器。

以下是切換式狀態機跟蹤的一些記錄,很亂,沒寫總結,只是用于備忘。。。
AI移動跟蹤
WinMain消息循環中的Game::Run()中先
1. gGameEngine->GetFrustumForPlayer(updateFrustum, player->GetCoords().origin); 得到frustum

2. gEngine->Update(&updateFrustum);進行更新, 其中
   調用 world->Update(worldFrustumList);

   然后遍歷每個frustum取得對應region進行更新

   a. 看看當前region是否與frustum相交,如果是則load,否則擴大一點再相交,這時如果相交則將添加到后臺加載。
   b. 查看portal相關region進行更新
   3. 查看connectedRegions(在地圖裝載得到玩家出生位置后進行玩家所在region擴大后跟其它region判斷相交所得)進行更新 

3. Region的更新中進行level更新:
  level->Update(frustumList, numFrustums, elapsedTime);
  在其中先取得在frustum中的Entity, 然后再遍歷更新所有Entity,
  之后再更新Entity所在4叉樹空間.

4. 角色的更新:
   Entity的更新中, 先UpdateSelf再UpdateAttachedEntities
   (Entity中有PhysicsRigidBody成員physicsObject)

5. UpdateSelf會跑到Character::PreAnimationUpdate中執行 baseController->Update(localTimeDelta);從而跳到ContrallerAI中執行GetExecutingState()->OnUpdate(deltaTime); 從而到達ControllerNpcStateIdle的更新中進行狀態切換到SetState("Wander", ControllerAIStateData(0, 0, 0)); 
之后再跑到ControllerNpcStateWander::OnBegin()
處理:
    int closestPoint = GetClosest(GetController().GetWanderPoints());
    GetController().SetCurrentWanderPoint(closestPoint);
    if (!MoveToCurrentWanderPoint())
    {
        SetState("Idle", ControllerAIStateData());
        return;
    }
這個在MoveToCurrentWanderPoint()函數里從隊列中取出當前目標點并ControllerAI::WalkTo
其中會GetController().WalkTo(location, target);即ControllerAI::WalkTo(。。), 這會執行:
 HandleAction(new WalkAction(GetParentId(), GetAI()->GetPathPosition(), location, target));
這個會執行:
        SetCurrentAction(action);
        GetCurrentAction()->Execute();從而運行了WalkAction::Execute(), 這其中又調用了Character::WalkTo
 這又會:
    movementMgr->SetNewPathTarget進行處理


最后在CharacterMovementManager::Update()中進行角色位置更新:

        CreateLocalPath(deltaTime, speed);

        if (!MoveDownPath(deltaTime, speed))
        {
            return false;
        }
        UpdateCharacterPosition(deltaTime, speed);

void UIDialogWindow::OnOpen()會調用 myNpc->AddSocialTarget( target );
在void ControllerNpcStateIdle::OnUpdate(Time deltaTime)中判斷如果有SocialTarget則進入Chat狀態處理

【狀態處理例子】
Monster的初始狀態是Idle,在Monster的更新函數里:
一)。進行搜敵,并切換成pursue狀態
,并調追捕狀態的OnBegin()函數處理,如果Monster不能行走則切回Idle狀態,否則如果搜不到敵
人則切換到Return狀態,否則根據當前技能id找出要移到的位置點.
------------------------------------------------------
【注意】找到要移到的位置點細節:
I. (Character::GetMoveToPoint)找出目標點:
  1. 目標是自己則直接return自己位置
  2. 沒有目標則保存goalPoint=目標點,distance=技能施放范圍,待后處理.
  3. 目標是FixedItem則return FixedItem->GetMoveToPoint(..)里進行處理
  4. 目標是StrategicMovementBase,則return sm->GetMoveToPoint(..)里進行處理
  5. 目標是Entity,則goalPoint = entity->GetCoords().origin;并且如果entity阻擋則讓goalPoint回移一點以免浮點出錯?否則distance=GetExtents() + entity-

>GetExtents();待后處理
  6. 目標是Character,則,
     a. 如果是朋友
       1)如果當前是移動狀態,則要求目標給出DefenseSlot(防御位置點)作為goalPoint直接返回.
       2)否則如果能直線通路到目標點的話就直接返回離目標比較近的一點(去掉半徑),不能直通則返回0點  
     b. 如果是敵人
       1)如果沒有技能,則goalPoint=目標點,distance=GetExtents() + target->GetExtents();待后處理
       2)如果技能不需要AttackSlot或者this是Player, 則
        goalPoint=目標點,distance = GetExtents() + target->GetExtents() + skill->GetRange();待后處理
       3)否則直接返回目標算出的AttackSlot攻擊點位置.
  上述2和5以及6中的b.的1)和2)需要待后處理的最后通過 
    WorldVec3 finalPoint = movementMgr->GetPointAwayFromGoal(goalPoint, distance);
  得到最終位置, 這個位置還要特殊判斷一下如果不在Region中或者路徑不能到達的話,則直接用TranslateToFloor到goalPoint.

【說明】:
  1. 什么是AttackSlot/DefenseSlot:
每個角色可以有n個x距離的AttackSlot/DefenseSlot,它會在周圍x半徑的圓上平分出n個位置點,當有其它人要攻擊它或者要來幫助(防御)它時,它就會在旁邊找一個較近的還

沒其它人用過的slot分給這個其它人。
  2. movementMgr->GetPointAwayFromGoal()函數細節:
    先是FindPath(目標)得出path,再用path->Advance(pathLength - distance)得到回退一點的位置。

II. 找到目標點后,還要調用movementGoalManager->GetClosestMovePoint(目標點) 進行處理:
    這個函數主要是給范圍武器用的,如果不是使用范圍武器的Monster則不會調整目標點。
    如果是的話則遍歷全局對象movementGoalManager中的m_MoveGoalMap目標點映射表,求出其它在同一region中的Monster
    所在目標點跟當前Monster所在目標點的距離,如果距離比較近則調用GetPointAwayFromGoal(目標點, 3.0);調整當前Monster的目標點回退一點,并將些處理后的位置及些

Monsterid映射到m_MoveGoalMap目標點映射表中。這樣遍歷過所有其它Monster的目標點進行一一檢測處理后就會盡量避免與其它Monster擠到一起。
------------------------------------------------------

找到要移到的位置點之后,
1. 用(CloseEnoughToUseSkill(GetCurrentEnemy(), GetCurrentSkillID()))判斷是否在技能攻擊范圍內,
如果在則用IsPathClear(GetCurrentEnemy())來判斷是不是到直通目標,是則切換成Attack狀態后返回,否則切換成NavigateObstacle狀態后返回。

2. 否則敵人不在攻擊范圍內就看當前是否已站在目標點,是則切回Idle狀態后返回

3. 不在目標點則看是不是能夠移到目標點,不能則切回Idle狀態后返回。

4. 能移到目標點則MoveTo到目標點.
   這個MoveTo會調用
   HandleAction(new MoveToAction(GetParentId(), GetAI()->GetPathPosition(), location, target, GetAI()->GetSkillReferenceNumber(skill), 1.0, animType));
   這個會執行到MoveToAction, 其中會轉調:
        monseter->SetCurrentAttackTarget(targetId, location, skillNumber);
        monseter->SkillWarmUp( skillNumber, false );
        monseter->MoveTo(location, GetBlendTime(), animType);
        monseter->PlayLoopingRunningSound();
  而monseter->MoveTo又會調用 movementMgr->SetNewPathTarget(movementMgr->GetPathPosition(), surfacePoint, alreadyThere))
  然后再用SetActionState(Character_ActionState_Move);設置Action的狀態為Move,并通過PlayAnimation播放run動作(即調用GetAnimationBase( type ).PlayAnimation( 

actor, selection, speedModifier, loop, iteration ),這個可以參考我另一個動畫跟蹤文檔看細節)

二)。搜敵后會接著調用ControllerAI::Update()更新函數:
   1. 先進行當前狀態更新()
      由于前面Monster切換到了pursue追捕狀態,所以執行到
      ControllerMonsterStatePursue::OnUpdate(),其中:
      a. 追捕所用時間過了,則切換回return狀態
      b. 重新選擇技能時間到了則重新找出一個bestSkill.(這也避免了萬一當前技能是melee,而玩家總是繞著Monster轉,怪就會不停地追不上而沒法肉搏攻擊)
      c. 用CloseEnoughToUseSkill判斷是否夠技能施放距離,夠的話用IsPathClear判斷攻擊方向是否可通,是則轉Attack狀態,不通則轉NavigateObstacle狀態.

   2. 再遍歷執行m_PreloadQuestActionList中action.

上述都在【更祥細一點】中1。Character::UpdateSelf()中進行
接著會到【更祥細一點】中2。 Update subsystems:中的FollowPath()進行真正的移動處理.
posted on 2012-08-13 10:09 flipcode 閱讀(363) 評論(0)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            伊人久久亚洲影院| 欧美高清在线| 欧美激情在线观看| 麻豆国产精品一区二区三区| 久久久另类综合| 久热精品视频在线观看一区| 老司机精品导航| 亚洲第一在线综合在线| 欧美激情国产日韩精品一区18| 欧美大片在线观看| 一区二区三区精品久久久| 亚洲欧美日韩一区二区三区在线| 欧美伊人久久| 欧美高清在线视频| 国产农村妇女精品| 亚洲精品一区二区三区av| 亚洲专区欧美专区| 久久综合网hezyo| 亚洲乱码国产乱码精品精98午夜| 亚洲一区二区黄| 久久午夜精品| 国产精品久久夜| 亚洲欧洲综合| 欧美一区二区高清在线观看| 欧美高清hd18日本| 亚洲欧美日韩一区在线观看| 欧美成人视屏| 国产亚洲一区二区三区| 亚洲免费观看视频| 久久久久久亚洲精品杨幂换脸| 亚洲精品国偷自产在线99热| 欧美一区永久视频免费观看| 国产欧美日韩在线| 亚洲欧美视频在线观看视频| 久久久久国产精品麻豆ai换脸 | 亚洲高清久久网| 夜夜嗨av一区二区三区四区| 欧美中文在线视频| 99精品视频免费在线观看| 久久精品盗摄| 国产精品日韩精品欧美精品| 日韩图片一区| 欧美成人亚洲| 欧美在线关看| 国产精品日韩一区二区| 99re视频这里只有精品| 久久综合给合| 午夜在线播放视频欧美| 欧美色视频一区| 欧美成人在线免费视频| 韩国一区二区三区在线观看| 亚洲欧美国产日韩天堂区| 亚洲人在线视频| 久久伊人精品天天| 韩日午夜在线资源一区二区| 久久精品99久久香蕉国产色戒| 一本大道久久a久久综合婷婷| 美日韩精品视频| 伊人久久亚洲美女图片| 久久伊伊香蕉| 久久久久久高潮国产精品视| 国产欧美va欧美不卡在线| 亚洲欧美中文字幕| 亚洲一区国产一区| 国产麻豆日韩| 欧美日韩一区二区三区视频 | 亚洲伦理一区| 欧美国产乱视频| 亚洲国产欧美在线| 女生裸体视频一区二区三区| 久久久久久久综合日本| 黄色一区二区三区| 麻豆国产精品一区二区三区 | 欧美色区777第一页| 奶水喷射视频一区| 亚洲啪啪91| 亚洲精品资源| 国产精品亚洲产品| 久久成人亚洲| 另类春色校园亚洲| 亚洲精品一区二区三区不| 亚洲激情成人网| 欧美日韩一区二区三区视频| 亚洲欧美日韩精品| 久久香蕉国产线看观看av| 最新中文字幕一区二区三区| 亚洲精品网站在线播放gif| 国产精品a久久久久久| 欧美综合国产| 欧美成人乱码一区二区三区| 亚洲午夜精品17c| 亚洲欧美日韩中文播放| 亚洲国产精品久久精品怡红院| 亚洲精品久久视频| 国产精品私拍pans大尺度在线| 欧美亚洲系列| 美女成人午夜| 午夜精品亚洲| 女人色偷偷aa久久天堂| 亚洲一区二区三区在线视频| 欧美一区二区三区免费在线看| 亚洲激情av在线| 亚洲午夜精品| 在线播放中文一区| 一本色道久久综合亚洲精品不| 亚洲午夜av| 亚洲国产欧美一区二区三区丁香婷| 宅男66日本亚洲欧美视频| 亚洲成人在线视频播放| 一本久久a久久免费精品不卡| 国内精品亚洲| 亚洲综合久久久久| 99国产精品久久久久久久| 久久久精品2019中文字幕神马| 国产精品99久久不卡二区| 久久视频国产精品免费视频在线| 亚洲综合电影| 欧美护士18xxxxhd| 久久五月激情| 国产欧美一区二区精品忘忧草| 亚洲美女中文字幕| 亚洲国产精品久久久久久女王| 亚洲综合清纯丝袜自拍| 亚洲伊人伊色伊影伊综合网| 欧美激情久久久久| 免费在线欧美视频| 国产精品yjizz| 亚洲国产精品久久久久秋霞影院| 国产乱肥老妇国产一区二| 日韩视频欧美视频| 日韩亚洲欧美一区| 美女亚洲精品| 欧美国产视频在线| 极品少妇一区二区三区| 欧美一级在线亚洲天堂| 性久久久久久久久| 国产精品伊人日日| 亚洲欧美在线免费| 欧美一级黄色录像| 国产日韩欧美二区| 性色av一区二区三区在线观看| 午夜精品久久久久久久男人的天堂| 欧美色图五月天| 亚洲视频在线播放| 欧美一级在线播放| 国产亚洲精品bt天堂精选| 香蕉精品999视频一区二区 | 亚洲综合色视频| 国产精品久久久久久久久久直播| 夜夜嗨av一区二区三区网站四季av| 99爱精品视频| 欧美亚洲成人精品| 性欧美video另类hd性玩具| 久久久噜噜噜| 亚洲精品韩国| 国产精品久久久久av| 午夜在线不卡| 欧美成人r级一区二区三区| 亚洲伦理在线免费看| 欧美日韩一区二区高清| 亚洲欧美另类在线| 男女视频一区二区| 一本一本大道香蕉久在线精品| 国产精品劲爆视频| 久久久久综合网| 99精品视频免费观看视频| 欧美影视一区| 最新中文字幕亚洲| 国产精品亚洲综合天堂夜夜| 久久久噜噜噜久久| 一本一道久久综合狠狠老精东影业| 国产日本欧美在线观看| 欧美在线中文字幕| 亚洲三级性片| 久久久久.com| 亚洲视频一区在线| 狠狠色丁香久久婷婷综合_中| 欧美激情一区二区三级高清视频| 亚洲一区二区三区色| 欧美国产日韩精品| 欧美一区二区女人| 99精品国产高清一区二区| 国产视频在线观看一区| 欧美精品免费视频| 久久精品国产久精国产爱| 99精品国产99久久久久久福利| 久久久在线视频| 亚洲一区二区精品视频| 亚洲国产99| 韩国精品在线观看| 国产精品久久久久久模特| 欧美成人午夜免费视在线看片| 亚洲欧美日韩电影| 亚洲手机在线| 99re热这里只有精品视频| 麻豆九一精品爱看视频在线观看免费| 日韩视频国产视频| 在线欧美日韩| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 国外成人性视频|