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

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>
            久久婷婷亚洲| 香蕉成人伊视频在线观看| 欧美成人激情视频| 欧美一级在线视频| 99视频精品全国免费| 亚洲精品永久免费| 99国产精品久久久久久久久久| 久久精品欧美日韩精品| 久久精品视频99| 免费h精品视频在线播放| 亚洲婷婷综合久久一本伊一区| 欧美韩国日本一区| 国产精品wwwwww| 国产偷久久久精品专区| 在线观看日韩欧美| 亚洲精品视频一区| 国产在线不卡| 韩日视频一区| 国产亚洲精品久久飘花| 在线观看亚洲专区| 一区二区精品国产| 欧美与黑人午夜性猛交久久久| 久久se精品一区二区| 欧美激情一区在线| 一个色综合av| 欧美中文字幕在线观看| 欧美~级网站不卡| 亚洲黄色三级| 亚洲伦理在线观看| 久久激情一区| 欧美日韩中国免费专区在线看| 国产日韩在线看片| 先锋影音网一区二区| 日韩一二三在线视频播| 久久国产99| 亚洲精品小视频在线观看| 午夜亚洲福利| 欧美日韩精品久久久| 激情另类综合| 香蕉成人啪国产精品视频综合网| 亚洲电影在线免费观看| 香蕉成人久久| 欧美三级电影大全| 亚洲精品偷拍| 免费观看成人鲁鲁鲁鲁鲁视频| 在线亚洲免费视频| 欧美激情视频在线免费观看 欧美视频免费一 | 国产精品日韩欧美综合 | 午夜欧美电影在线观看| 亚洲东热激情| 久久久久88色偷偷免费| 欧美多人爱爱视频网站| 亚洲欧美日韩专区| 99热精品在线| 欧美福利网址| 亚洲黄网站黄| 欧美高清你懂得| 久久夜色精品国产| 精品动漫一区| 理论片一区二区在线| 欧美一级午夜免费电影| 国产精品夜夜夜| 香蕉久久精品日日躁夜夜躁| 亚洲一区日韩| 国产无一区二区| 久久精品一区二区三区不卡| 欧美主播一区二区三区美女 久久精品人| 国产精品爽爽ⅴa在线观看| 国产精品网站一区| 午夜伦理片一区| 国产一区二区三区丝袜| 欧美专区在线观看一区| 亚洲无毛电影| 国产日韩欧美一区在线| 久久久天天操| 国产女主播一区二区| 亚洲理论在线| 一本色道久久综合| 国产精品一区三区| 裸体一区二区三区| 欧美激情久久久| 亚洲一区二区三区中文字幕在线| 一区二区三区欧美成人| 国产婷婷色综合av蜜臀av | 亚洲国产精品一区二区第一页 | 亚洲欧美日韩精品在线| 亚洲一区二区免费看| 国产一区欧美| 欧美激情一区二区三区四区| 欧美亚一区二区| 久久蜜桃精品| 欧美激情视频一区二区三区在线播放| 欧美福利电影网| 亚洲欧美网站| 久久艳片www.17c.com| 亚洲一区精品电影| 久久精品女人天堂| 亚洲专区欧美专区| 久色成人在线| 91久久精品日日躁夜夜躁国产| 久久久精品性| 亚洲免费影视第一页| 久久精品一区二区三区不卡| 99在线观看免费视频精品观看| 亚洲欧美日韩一区二区三区在线观看| 亚洲国产一区二区三区a毛片| 亚洲一区中文字幕在线观看| 亚洲三级影院| 久久久999精品免费| 一区二区三区精品视频| 久久国产直播| 午夜精品久久久久久久99黑人| 欧美www视频| 久久色在线观看| 国产精品日韩在线观看| 亚洲片区在线| 最新国产成人av网站网址麻豆| 亚洲欧美日韩精品综合在线观看| 国产精品久久久久久av下载红粉| 欧美肥婆在线| 亚洲欧美视频一区二区三区| 亚洲乱亚洲高清| 久久亚洲一区二区三区四区| 久久精品av麻豆的观看方式| 欧美日韩中文字幕在线| 91久久精品国产91久久| 亚洲第一在线| 久久久免费精品| 久久蜜桃资源一区二区老牛 | 亚洲欧美中文字幕| 蜜臀av性久久久久蜜臀aⅴ| 亚洲私拍自拍| 欧美福利视频一区| 欧美高清在线观看| 国产丝袜一区二区三区| 亚洲精品精选| 亚洲激情在线| 美日韩免费视频| 久热精品视频在线| 精品91久久久久| 欧美在线黄色| 久久久www| 狠狠干狠狠久久| 午夜精品国产精品大乳美女| 欧美午夜不卡视频| 亚洲素人一区二区| 亚洲女爱视频在线| 午夜精品久久久99热福利| 日韩视频一区二区| 亚洲欧美影音先锋| 欧美一区二区视频在线| 国产精品日韩精品欧美精品| 亚洲一区在线免费| 久久不见久久见免费视频1| 国产精品网站一区| 久久精品国产69国产精品亚洲 | 亚洲国产成人在线| 欧美激情1区2区3区| 亚洲日本va午夜在线电影| 一区二区三区波多野结衣在线观看| 欧美日产在线观看| 亚洲在线视频免费观看| 久久亚洲私人国产精品va媚药| 亚洲欧美日韩国产中文| 久热精品视频在线免费观看| 国产亚洲欧美一区在线观看| 香蕉久久a毛片| 久久久国产精品亚洲一区| 国产综合av| 久久这里有精品视频| 91久久夜色精品国产九色| 宅男精品视频| 国产嫩草影院久久久久| 久久久久久久综合| 亚洲国产精品嫩草影院| 亚洲一区二区视频在线| 在线视频精品一区| 欧美11—12娇小xxxx| 99re热精品| 久久香蕉国产线看观看av| 亚洲精品在线视频| 国产精品永久免费在线| 免费在线亚洲欧美| 亚洲欧美国产毛片在线| 亚洲精品永久免费| 欧美日韩精品一区| 亚洲欧美日韩在线不卡| 欧美国产日韩视频| 午夜精品国产| 日韩系列在线| 国产综合视频在线观看| 欧美色视频一区| 榴莲视频成人在线观看| 亚洲专区免费| 亚洲国产日韩欧美一区二区三区| 欧美一区二区免费视频| 一区二区三区视频在线看| 久久精品午夜| 亚洲综合激情| 99香蕉国产精品偷在线观看|