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 阅读(175)
评论(0) 编辑 收藏 引用