posts - 72,  comments - 4,  trackbacks - 0

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)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理