mythos中的ai是并發(fā)的棧式狀態(tài)機(jī):
拿wolf作為例子:
一。配置文件:
在ai目錄中的wolf.xml配置它所有的行為(包括每個(gè)行為發(fā)生機(jī)率,參數(shù),以及執(zhí)行函數(shù)):
其中執(zhí)行函數(shù)以及對(duì)應(yīng)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中遍歷執(zhí)行該unit的所有行為(behavior) :
1. sBehaviorApproachTarget()
查找對(duì)應(yīng)的目標(biāo),發(fā)出朝它移動(dòng)指令
1. sBehaviorDoSkill()
如果有目標(biāo)則執(zhí)行sSkillExecute進(jìn)行技能施放
2. ...類似功能處理
。。。
【說明】:
mythos的行為是并發(fā)的棧式,最大可以有5個(gè)棧, 用
int nIndex = tContext.pnStack[ tContext.nStackCurr ]這樣的結(jié)構(gòu)進(jìn)行處理,
通過pTable->pBehaviors[ nIndex ]得到對(duì)應(yīng)的行為處理函數(shù)進(jìn)行執(zhí)行處理。
a. 并發(fā):
每執(zhí)行完一個(gè)行為函數(shù)后 tContext.pnStack[ tContext.nStackCurr ]++; 這樣就換到unit的下一個(gè)行為函數(shù)再執(zhí)行。
b. 進(jìn)入棧(子函數(shù)):
tContext.nStackCurr為棧下標(biāo),初始tContext.nStackCurr=0,即為第0個(gè)棧,
可以設(shè)置tContext.nStackCurr++;并且tContext.pnStack[ tContext.nStackCurr ]=nBranchTo(要走的分支號(hào))。這樣來
執(zhí)行分支函數(shù)。 當(dāng)分支函數(shù)完成時(shí)tContext.nStackCurr--再回來上一級(jí)。
另外有些行為函數(shù)是執(zhí)行一次的,執(zhí)行完了就會(huì)把它從列表中刪除。下次不會(huì)再遍歷到.
posted on 2012-08-13 09:51
flipcode 閱讀(186)
評(píng)論(0) 編輯 收藏 引用