posts - 72,  comments - 4,  trackbacks - 0
gunz的ai处理(备忘)
[更新]
一个Actor更新中:
1. m_TaskManager.Run(fDelta);
2. ProcessNetwork(fDelta);
3. ProcessAI(fDelta);
   处理actor->Brain->Think()中
bool bFind = FindTarget();
if ( bFind)
{
  ProcessBuildPath( fDelta);
  ProcessAttack( fDelta);
}
4. ProcessMovement(fDelta);
5. ProcessMotion(fDelta);
一。ProcessAI()
    actor->Brain->Think()处理中产生一个Task
    一个任务有 移动,攻击,延时,转向等,其中攻击有肉搏,范围,技能
    比如:actor->Brain->Think()中发了现敌人后在ProcessAttack()中产生一个skilltask存入到
    actor->m_TaskManager中
二。m_TaskManager.Run()
   在在taskMgr中处理m_pCurrTask的3个步骤(start,run,complete):
   举例: 如ZTask_Skill:
   1. OnStart()中
     a.parent(是一个actor)->Skill(m_nSkill); // 进行动作输入(动作用了m_AniFSM进行管理)
     b.ZPostNPCSkillStart(ownerid,nSkill,Targetid,TargetPos);
       这会生成一个id为MC_QUEST_PEER_NPC_SKILL_START的cmd并push到全局的m_CommandManager中
   2. OnRun()中
       if时间到了则ZPostNPCSkillExecute(ownerid,nSkill,Targetid,TargetPos);
       产生的命令id==MC_QUEST_PEER_NPC_SKILL_EXECUTE;
   3 . OnComplete()中
       ZTask_Skill中无处理.
三。m_pGameInterface->Update()中从m_CommandQueue中取出cmd, 对其:
    1. SendCommand(pCommand);
    2. OnCommand(pCommand);
       switch(cmd->id)调用对应的处理函数,
      例如:
      a. id==MC_QUEST_PEER_NPC_SKILL_START时将调用OnPeerNPCSkillStart()
         在其中通过uidOwner找得actor得到它的ZModule_Skills处理模块传入cmd的参数处理之.
         这会进行发起特效处理
      b. id==MC_QUEST_PEER_NPC_SKILL_EXECUTE时时将调用OnPeerNPCSkillExecute()
         在其中通过uidOwner找得actor得到它的ZModule_Skills处理模块传入cmd的参数处理之.
         这会进行攻击特效处理:
         1). 如果是bHitCheck标志的特效,则转让全局的武器管理类处理:
             m_WeaponManager.AddMagic( this, vMissilePos, vMissileDir, m_pOwner);进行处理
    这里判断如果循环次数减到0,则m_bEnable = false;
         2).否则:
           a. 如果有相机震动标志,则通知照相机震动处理
             GetCamera()->Shock( fPower*fDefaultPower, fDuration, rvector( 0.0f, 0.0f, -1.0f));
           b. 遍历所有角色,检测是否范围内以及抗性没抵消完伤害:
              (1)是攻击则
                 pObject->OnDamaged(..)
                 否则               
pObject->OnHealing(..)
              (2)限速:
                 pMovableModule->SetMoveSpeedRestrictRatio( 0, fDuration);
               
              (3)击退:
                 pObject->AddVelocity( m_pDesc->fModKnockback * 7.f * -dir);
          3). 特效燃烧效果:
if(m_pDesc->szCastingEffect[0]) {
    if(type != eq_parts_pos_info_etc)
    efgmgr->AddPartsPosType(m_pDesc->szCastingEffect, Targetid,type,m_pDesc->nEffectTime);
else 
efgmgr->Add(m_pDesc->szCastingEffect, vPos,vDir,OwnerID,m_pDesc->nEffectTime);
}
          
if(m_pDesc->szCastingEffectSp[0]) {
ZGetEffectManager()->AddSp(m_pDesc->szCastingEffectSp,m_pDesc->nCastingEffectSpCount,
vPos,vDir,m_pOwner->GetUID());
}
           3). 提示信息显示处理
           4). 声音播放处理.
四。ZWeaponMgr处理:
    上述的OnPeerNPCSkillExecute()处理中发现是飞行特效转交给ZWeaponMgr来处理,所以这里说一下
   在这里会处理特效模型飞行并处理Explosion( type, pPickObject,pickdir);爆炸伤害!转调用到pTarget->OnDamaged(..)
posted on 2012-08-13 09:49 flipcode 阅读(274) 评论(0)  编辑 收藏 引用

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