[更新]
一個(gè)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()處理中產(chǎn)生一個(gè)Task
一個(gè)任務(wù)有 移動(dòng),攻擊,延時(shí),轉(zhuǎn)向等,其中攻擊有肉搏,范圍,技能
比如:actor->Brain->Think()中發(fā)了現(xiàn)敵人后在ProcessAttack()中產(chǎn)生一個(gè)skilltask存入到
actor->m_TaskManager中
二。m_TaskManager.Run()
在在taskMgr中處理m_pCurrTask的3個(gè)步驟(start,run,complete):
舉例: 如ZTask_Skill:
1. OnStart()中
a.parent(是一個(gè)actor)->Skill(m_nSkill); // 進(jìn)行動(dòng)作輸入(動(dòng)作用了m_AniFSM進(jìn)行管理)
b.ZPostNPCSkillStart(ownerid,nSkill,Targetid,TargetPos);
這會(huì)生成一個(gè)id為MC_QUEST_PEER_NPC_SKILL_START的cmd并push到全局的m_CommandManager中
2. OnRun()中
if時(shí)間到了則ZPostNPCSkillExecute(ownerid,nSkill,Targetid,TargetPos);
產(chǎn)生的命令id==MC_QUEST_PEER_NPC_SKILL_EXECUTE;
3 . OnComplete()中
ZTask_Skill中無處理.
三。m_pGameInterface->Update()中從m_CommandQueue中取出cmd, 對(duì)其:
1. SendCommand(pCommand);
2. OnCommand(pCommand);
switch(cmd->id)調(diào)用對(duì)應(yīng)的處理函數(shù),
例如:
a. id==MC_QUEST_PEER_NPC_SKILL_START時(shí)將調(diào)用OnPeerNPCSkillStart()
在其中通過uidOwner找得actor得到它的ZModule_Skills處理模塊傳入cmd的參數(shù)處理之.
這會(huì)進(jìn)行發(fā)起特效處理
b. id==MC_QUEST_PEER_NPC_SKILL_EXECUTE時(shí)時(shí)將調(diào)用OnPeerNPCSkillExecute()
在其中通過uidOwner找得actor得到它的ZModule_Skills處理模塊傳入cmd的參數(shù)處理之.
這會(huì)進(jìn)行攻擊特效處理:
1). 如果是bHitCheck標(biāo)志的特效,則轉(zhuǎn)讓全局的武器管理類處理:
m_WeaponManager.AddMagic( this, vMissilePos, vMissileDir, m_pOwner);進(jìn)行處理
這里判斷如果循環(huán)次數(shù)減到0,則m_bEnable = false;
2).否則:
a. 如果有相機(jī)震動(dòng)標(biāo)志,則通知照相機(jī)震動(dòng)處理
GetCamera()->Shock( fPower*fDefaultPower, fDuration, rvector( 0.0f, 0.0f, -1.0f));
b. 遍歷所有角色,檢測(cè)是否范圍內(nèi)以及抗性沒抵消完傷害:
(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()處理中發(fā)現(xiàn)是飛行特效轉(zhuǎn)交給ZWeaponMgr來處理,所以這里說一下
在這里會(huì)處理特效模型飛行并處理Explosion( type, pPickObject,pickdir);爆炸傷害!轉(zhuǎn)調(diào)用到pTarget->OnDamaged(..)
posted on 2012-08-13 09:49
flipcode 閱讀(288)
評(píng)論(0) 編輯 收藏 引用