mythos中的ai是并發的棧式狀態機:
拿wolf作為例子:
一。配置文件:
在ai目錄中的wolf.xml配置它所有的行為(包括每個行為發生機率,參數,以及執行函數):
其中執行函數以及對應skillid如下:
1.
<nBehaviorId>move - approach target</nBehaviorId>
<nSkillId>monster melee</nSkillId>
2.
<nBehaviorId>skill - do skill</nBehaviorId>
<nSkillId>monster melee</nSkillId>
3.
<nBehaviorId>skill - do skill</nBehaviorId>
<nSkillId>Fidget</nSkillId>
4.
<nBehaviorId>move - wander</nBehaviorId>
<nSkillId/>
二。ai更新:
SrvGameTick--》GameEventsProcess--》AI_Update()
在AI_Update中遍歷執行該unit的所有行為(behavior) :
1. sBehaviorApproachTarget()
查找對應的目標,發出朝它移動指令
1. sBehaviorDoSkill()
如果有目標則執行sSkillExecute進行技能施放
2. ...類似功能處理
。。。
【說明】:
mythos的行為是并發的棧式,最大可以有5個棧, 用
int nIndex = tContext.pnStack[ tContext.nStackCurr ]這樣的結構進行處理,
通過pTable->pBehaviors[ nIndex ]得到對應的行為處理函數進行執行處理。
a. 并發:
每執行完一個行為函數后 tContext.pnStack[ tContext.nStackCurr ]++; 這樣就換到unit的下一個行為函數再執行。
b. 進入棧(子函數):
tContext.nStackCurr為棧下標,初始tContext.nStackCurr=0,即為第0個棧,
可以設置tContext.nStackCurr++;并且tContext.pnStack[ tContext.nStackCurr ]=nBranchTo(要走的分支號)。這樣來
執行分支函數。 當分支函數完成時tContext.nStackCurr--再回來上一級。
另外有些行為函數是執行一次的,執行完了就會把它從列表中刪除。下次不會再遍歷到.
posted on 2012-08-13 09:51
flipcode 閱讀(176)
評論(0) 編輯 收藏 引用