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

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

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

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

2. gEngine->Update(&updateFrustum);進(jìn)行更新, 其中
   調(diào)用 world->Update(worldFrustumList);

   然后遍歷每個frustum取得對應(yīng)region進(jìn)行更新

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

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

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

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


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

        CreateLocalPath(deltaTime, speed);

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

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

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

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

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

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

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

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

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

2. 否則敵人不在攻擊范圍內(nèi)就看當(dāng)前是否已站在目標(biāo)點,是則切回Idle狀態(tài)后返回

3. 不在目標(biāo)點則看是不是能夠移到目標(biāo)點,不能則切回Idle狀態(tài)后返回。

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

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

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

   2. 再遍歷執(zhí)行m_PreloadQuestActionList中action.

上述都在【更祥細(xì)一點】中1。Character::UpdateSelf()中進(jìn)行
接著會到【更祥細(xì)一點】中2。 Update subsystems:中的FollowPath()進(jìn)行真正的移動處理.
posted on 2012-08-13 10:09 flipcode 閱讀(367) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久精品亚洲精品| 午夜精品在线| 欧美激情中文字幕一区二区| 久久琪琪电影院| 狠狠入ady亚洲精品| 久久综合伊人77777蜜臀| 久久精品三级| 亚洲精品综合久久中文字幕| 亚洲精品永久免费| 国产精品久久国产精麻豆99网站| 性做久久久久久| 久久精品30| 日韩亚洲在线观看| 亚洲一区二区三区四区五区午夜 | 亚洲视频碰碰| 国产精品一区二区三区四区五区| 久久久久看片| 欧美成人免费视频| 亚洲欧美不卡| 久久久久国产精品一区二区| 99精品国产高清一区二区| 一区二区三区日韩欧美| 国内外成人免费视频| 欧美华人在线视频| 国产精品美女视频网站| 嫩草成人www欧美| 欧美日韩国产欧| 久久伊人精品天天| 欧美日韩国产不卡| 久久久久一区二区三区| 欧美日韩不卡| 久久免费午夜影院| 欧美日韩一区二区在线视频 | 久久国产一区二区| 欧美大片一区| 久久精品99国产精品日本| 欧美r片在线| 久久精品国产2020观看福利| 欧美精品www| 理论片一区二区在线| 国产精品久久久久久亚洲毛片| 欧美sm视频| 国产亚洲精品久久久久久| 亚洲精品美女在线| 久久久久久999| 欧美欧美全黄| 欧美高清视频在线| 国产一区二区毛片| 亚洲网址在线| 一区二区日韩| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美日韩一区二区三区| 欧美电影在线播放| 国色天香一区二区| 午夜欧美大尺度福利影院在线看 | 亚洲第一级黄色片| 亚洲欧美成人一区二区在线电影| 一区二区高清在线观看| 欧美高清一区| 亚洲国产欧美不卡在线观看| 尤物99国产成人精品视频| 午夜在线一区二区| 欧美亚洲专区| 国产欧美一区二区三区在线看蜜臀 | 亚洲一区二区av电影| 欧美高清视频一区二区| 亚洲黄色影院| 日韩一级免费观看| 欧美日韩亚洲综合| 一区二区三区 在线观看视频| 亚洲视频在线二区| 欧美日韩视频在线一区二区| 亚洲精品小视频在线观看| 在线视频免费在线观看一区二区| 欧美黄色aa电影| 亚洲人成绝费网站色www| 99视频精品| 欧美午夜电影网| 亚洲在线中文字幕| 久久婷婷久久一区二区三区| 亚洲第一二三四五区| 欧美大片第1页| 日韩视频中文字幕| 性色av一区二区三区在线观看| 国产欧美精品在线观看| 久久精品亚洲热| 亚洲福利电影| 亚洲伊人一本大道中文字幕| 国产日韩欧美一区二区三区四区 | 亚洲国产欧美一区二区三区久久| 亚洲精品中文在线| 国产精品国产亚洲精品看不卡15| 性欧美激情精品| 欧美成人亚洲| 亚洲视频一二| 韩日午夜在线资源一区二区| 欧美黄色影院| 午夜精品理论片| 欧美黄污视频| 西西人体一区二区| 亚洲国产一区二区三区在线播| 欧美午夜一区二区三区免费大片| 久久精品成人欧美大片古装| 亚洲国产日韩一区| 久久国产精品毛片| 一本到高清视频免费精品| 国产亚洲成av人片在线观看桃| 免费观看亚洲视频大全| 在线一区亚洲| 亚洲电影在线看| 久久er99精品| 在线视频一区观看| 在线日韩av片| 国产美女精品免费电影| 欧美日韩国产综合视频在线| 久久精品国产久精国产一老狼 | 裸体素人女欧美日韩| 亚洲午夜av| 亚洲精品国产品国语在线app| 国产乱子伦一区二区三区国色天香| 麻豆国产精品一区二区三区 | 亚洲精品久久久久久下一站 | 亚洲精品一区二区三区在线观看| 久久精品一区二区| 亚洲一区日韩在线| 亚洲日本aⅴ片在线观看香蕉| 国产偷国产偷精品高清尤物| 欧美网站在线观看| 欧美高清视频一二三区| 久久全球大尺度高清视频| 亚洲综合日韩| 亚洲社区在线观看| 日韩亚洲欧美综合| 亚洲激情亚洲| 亚洲第一福利视频| 欧美成人激情视频| 欧美bbbxxxxx| 免费久久99精品国产| 久热精品视频在线| 久久久久综合网| 久久精品人人| 久久久久久免费| 久久久水蜜桃av免费网站| 久久精品久久99精品久久| 欧美影院在线播放| 久久精品99国产精品| 久久国产精品一区二区三区| 久久国产精品亚洲77777| 久久精品国产成人| 久久久综合香蕉尹人综合网| 久久亚洲精品网站| 蜜臀av性久久久久蜜臀aⅴ| 久久在精品线影院精品国产| 美女精品在线| 欧美激情精品| 亚洲精品乱码| 一区二区三区高清不卡| 亚洲一区综合| 欧美与欧洲交xxxx免费观看| 久久精品国产在热久久| 久久综合狠狠综合久久激情| 欧美xxxx在线观看| 欧美三日本三级少妇三2023| 国产精品免费看| 国产一区亚洲| 亚洲国产精品一区二区第四页av| 亚洲精品久久久久| 亚洲午夜国产一区99re久久| 性欧美xxxx大乳国产app| 久久免费少妇高潮久久精品99| 欧美福利视频网站| 日韩视频第一页| 亚洲欧美日韩专区| 久久综合狠狠综合久久综合88| 欧美劲爆第一页| 国产精品视频久久久| 在线观看一区| 一区二区三区日韩欧美| 久久狠狠亚洲综合| 亚洲第一伊人| 亚洲欧美日韩国产一区| 媚黑女一区二区| 国产精品久久福利| 亚洲国产日本| 欧美专区在线观看一区| 亚洲国产精品欧美一二99| 亚洲性图久久| 欧美ed2k| 国内外成人免费激情在线视频网站| 亚洲精品乱码久久久久久久久| 久久国产欧美精品| 亚洲巨乳在线| 久久免费视频在线观看| 国产精品国产三级国产aⅴ入口| 亚洲第一狼人社区| 西瓜成人精品人成网站| 亚洲欧洲另类| 美日韩精品免费观看视频| 国产日韩欧美另类| 亚洲图片在线|