青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 72,  comments - 4,  trackbacks - 0
 
由于想在游戲中(非mfc程序)調用一個dll用來監控游戲中一些數據變化,而這些數據可以觸發式變動,所以想到用mfc來弄,
但網上查的
“非mfc程序調用mfc擴展dll”似乎有點麻煩,也沒有什么成樣的例子。
后來還是自己對比正常的mfc程序加載方式修改出來了,步驟如下:
1.  
exe工程要設置成Use Standard Windows Libraries或者Use MFC in a Shared DLL(因為我們不用mfc,所以設置成前者)
2. 
dll工程用vc向導創建mfc擴展dll
3. 在dll工程中拷貝相關的app,mainfrm和view以及doc框架(可以用vc向導創建一個正常mfc框架程序用來拷貝)
然后在dllmain的attach中加入如下語句即可:
//----------------------------------------
// AFX internal initialization
if (!AfxWinInit(hInstance, 0, "", 1))
return 0;
// Register the doc templates we provide to the app
CWinApp* pApp = AfxGetApp();
ENSURE(pApp != NULL);
pApp->InitApplication();
pApp->InitInstance();
//----------------------------------------
4. 如果是隱式調用的話,在exe中加入:
#define AFX_EXT_API  __declspec(dllexport)
#include "..\mfcdll\mfcdll.h"  // 這個是dll要導出的東西
這樣就可以了

5.顯式調用的話,用LoadLibrary先裝載,再獲取對應導出函數調用就應該也可以了(這個沒試)

6.上述處理后只能顯示,但按鍵接收還不行,因為消息循環沒有地方調用。。。它原來是系統調用app->run(),在其中循環處理的。
如果直接在dll中調用app的run()的話,mainfrm的PreTranslateMessage就能收到按鍵消息了。但這樣由于是主線程中調用app->run(),而run()中
是消息死循環,所會exe會沒機會響應。。。所以解決辦法是模擬app->run()寫一個runoneframe()函數,然后每次刷新一下(或者創建新線程來刷新, 臨時試了一下會crash,我沒用這種辦法,先不查了,不過理論上應該可以的)
這樣就ok了(view中按鍵自己再處理吧,這里不提了)
posted @ 2012-09-14 15:56 flipcode 閱讀(1365) | 評論 (0)編輯 收藏
火矩之光中的導航圖:
火矩之光 中已經拋棄高位圖地形之類的作法,換用了模型,為了能作出迷宮,把地圖分塊,每塊是一個模型,
每個模型有幾條通路,這樣各通路可以據算法得出隨機組合的謎宮,為了豐富,每個入路有好幾套模型可以隨機
選取,然后根據所選擇的模型再隨機組合出復雜的謎宮。
而對于路點,則是平均格子求得的,這點跟普通網游的作法還是有點類似的,
不是真正意義上的3維尋路,還是2維的, 作法應該是從上往下跟碰撞模型進行垂直求交得出路點,
然后再對路點進行通路測試,產生導航圖。(它不是用幾何網格生成的導航圖)

看下圖我的一個測試:
左邊是一個模型,右邊是個有樓梯的另一個模型(它是個入口)。藍色格是導航點。藍色塊是尋出的路點。

posted @ 2012-08-27 10:35 flipcode 閱讀(223) | 評論 (0)編輯 收藏
泰坦之旅的ai

titan quest的AI用的是切換式的狀態機,而尋路用的是path engine第3方庫,游戲中有一個任務編輯器主要是生成每一個任務,每個任務中可以生成多個觸發器(trigger),每個觸發器可以生成一系列條件(condition),并可生成條件成立時要觸發的動作(action). 這個有點類似war3的事件編輯器。

以下是切換式狀態機跟蹤的一些記錄,很亂,沒寫總結,只是用于備忘。。。
AI移動跟蹤
WinMain消息循環中的Game::Run()中先
1. gGameEngine->GetFrustumForPlayer(updateFrustum, player->GetCoords().origin); 得到frustum

2. gEngine->Update(&updateFrustum);進行更新, 其中
   調用 world->Update(worldFrustumList);

   然后遍歷每個frustum取得對應region進行更新

   a. 看看當前region是否與frustum相交,如果是則load,否則擴大一點再相交,這時如果相交則將添加到后臺加載。
   b. 查看portal相關region進行更新
   3. 查看connectedRegions(在地圖裝載得到玩家出生位置后進行玩家所在region擴大后跟其它region判斷相交所得)進行更新 

3. Region的更新中進行level更新:
  level->Update(frustumList, numFrustums, elapsedTime);
  在其中先取得在frustum中的Entity, 然后再遍歷更新所有Entity,
  之后再更新Entity所在4叉樹空間.

4. 角色的更新:
   Entity的更新中, 先UpdateSelf再UpdateAttachedEntities
   (Entity中有PhysicsRigidBody成員physicsObject)

5. UpdateSelf會跑到Character::PreAnimationUpdate中執行 baseController->Update(localTimeDelta);從而跳到ContrallerAI中執行GetExecutingState()->OnUpdate(deltaTime); 從而到達ControllerNpcStateIdle的更新中進行狀態切換到SetState("Wander", ControllerAIStateData(0, 0, 0)); 
之后再跑到ControllerNpcStateWander::OnBegin()
處理:
    int closestPoint = GetClosest(GetController().GetWanderPoints());
    GetController().SetCurrentWanderPoint(closestPoint);
    if (!MoveToCurrentWanderPoint())
    {
        SetState("Idle", ControllerAIStateData());
        return;
    }
這個在MoveToCurrentWanderPoint()函數里從隊列中取出當前目標點并ControllerAI::WalkTo
其中會GetController().WalkTo(location, target);即ControllerAI::WalkTo(。。), 這會執行:
 HandleAction(new WalkAction(GetParentId(), GetAI()->GetPathPosition(), location, target));
這個會執行:
        SetCurrentAction(action);
        GetCurrentAction()->Execute();從而運行了WalkAction::Execute(), 這其中又調用了Character::WalkTo
 這又會:
    movementMgr->SetNewPathTarget進行處理


最后在CharacterMovementManager::Update()中進行角色位置更新:

        CreateLocalPath(deltaTime, speed);

        if (!MoveDownPath(deltaTime, speed))
        {
            return false;
        }
        UpdateCharacterPosition(deltaTime, speed);

void UIDialogWindow::OnOpen()會調用 myNpc->AddSocialTarget( target );
在void ControllerNpcStateIdle::OnUpdate(Time deltaTime)中判斷如果有SocialTarget則進入Chat狀態處理

【狀態處理例子】
Monster的初始狀態是Idle,在Monster的更新函數里:
一)。進行搜敵,并切換成pursue狀態
,并調追捕狀態的OnBegin()函數處理,如果Monster不能行走則切回Idle狀態,否則如果搜不到敵
人則切換到Return狀態,否則根據當前技能id找出要移到的位置點.
------------------------------------------------------
【注意】找到要移到的位置點細節:
I. (Character::GetMoveToPoint)找出目標點:
  1. 目標是自己則直接return自己位置
  2. 沒有目標則保存goalPoint=目標點,distance=技能施放范圍,待后處理.
  3. 目標是FixedItem則return FixedItem->GetMoveToPoint(..)里進行處理
  4. 目標是StrategicMovementBase,則return sm->GetMoveToPoint(..)里進行處理
  5. 目標是Entity,則goalPoint = entity->GetCoords().origin;并且如果entity阻擋則讓goalPoint回移一點以免浮點出錯?否則distance=GetExtents() + entity-

>GetExtents();待后處理
  6. 目標是Character,則,
     a. 如果是朋友
       1)如果當前是移動狀態,則要求目標給出DefenseSlot(防御位置點)作為goalPoint直接返回.
       2)否則如果能直線通路到目標點的話就直接返回離目標比較近的一點(去掉半徑),不能直通則返回0點  
     b. 如果是敵人
       1)如果沒有技能,則goalPoint=目標點,distance=GetExtents() + target->GetExtents();待后處理
       2)如果技能不需要AttackSlot或者this是Player, 則
        goalPoint=目標點,distance = GetExtents() + target->GetExtents() + skill->GetRange();待后處理
       3)否則直接返回目標算出的AttackSlot攻擊點位置.
  上述2和5以及6中的b.的1)和2)需要待后處理的最后通過 
    WorldVec3 finalPoint = movementMgr->GetPointAwayFromGoal(goalPoint, distance);
  得到最終位置, 這個位置還要特殊判斷一下如果不在Region中或者路徑不能到達的話,則直接用TranslateToFloor到goalPoint.

【說明】:
  1. 什么是AttackSlot/DefenseSlot:
每個角色可以有n個x距離的AttackSlot/DefenseSlot,它會在周圍x半徑的圓上平分出n個位置點,當有其它人要攻擊它或者要來幫助(防御)它時,它就會在旁邊找一個較近的還

沒其它人用過的slot分給這個其它人。
  2. movementMgr->GetPointAwayFromGoal()函數細節:
    先是FindPath(目標)得出path,再用path->Advance(pathLength - distance)得到回退一點的位置。

II. 找到目標點后,還要調用movementGoalManager->GetClosestMovePoint(目標點) 進行處理:
    這個函數主要是給范圍武器用的,如果不是使用范圍武器的Monster則不會調整目標點。
    如果是的話則遍歷全局對象movementGoalManager中的m_MoveGoalMap目標點映射表,求出其它在同一region中的Monster
    所在目標點跟當前Monster所在目標點的距離,如果距離比較近則調用GetPointAwayFromGoal(目標點, 3.0);調整當前Monster的目標點回退一點,并將些處理后的位置及些

Monsterid映射到m_MoveGoalMap目標點映射表中。這樣遍歷過所有其它Monster的目標點進行一一檢測處理后就會盡量避免與其它Monster擠到一起。
------------------------------------------------------

找到要移到的位置點之后,
1. 用(CloseEnoughToUseSkill(GetCurrentEnemy(), GetCurrentSkillID()))判斷是否在技能攻擊范圍內,
如果在則用IsPathClear(GetCurrentEnemy())來判斷是不是到直通目標,是則切換成Attack狀態后返回,否則切換成NavigateObstacle狀態后返回。

2. 否則敵人不在攻擊范圍內就看當前是否已站在目標點,是則切回Idle狀態后返回

3. 不在目標點則看是不是能夠移到目標點,不能則切回Idle狀態后返回。

4. 能移到目標點則MoveTo到目標點.
   這個MoveTo會調用
   HandleAction(new MoveToAction(GetParentId(), GetAI()->GetPathPosition(), location, target, GetAI()->GetSkillReferenceNumber(skill), 1.0, animType));
   這個會執行到MoveToAction, 其中會轉調:
        monseter->SetCurrentAttackTarget(targetId, location, skillNumber);
        monseter->SkillWarmUp( skillNumber, false );
        monseter->MoveTo(location, GetBlendTime(), animType);
        monseter->PlayLoopingRunningSound();
  而monseter->MoveTo又會調用 movementMgr->SetNewPathTarget(movementMgr->GetPathPosition(), surfacePoint, alreadyThere))
  然后再用SetActionState(Character_ActionState_Move);設置Action的狀態為Move,并通過PlayAnimation播放run動作(即調用GetAnimationBase( type ).PlayAnimation( 

actor, selection, speedModifier, loop, iteration ),這個可以參考我另一個動畫跟蹤文檔看細節)

二)。搜敵后會接著調用ControllerAI::Update()更新函數:
   1. 先進行當前狀態更新()
      由于前面Monster切換到了pursue追捕狀態,所以執行到
      ControllerMonsterStatePursue::OnUpdate(),其中:
      a. 追捕所用時間過了,則切換回return狀態
      b. 重新選擇技能時間到了則重新找出一個bestSkill.(這也避免了萬一當前技能是melee,而玩家總是繞著Monster轉,怪就會不停地追不上而沒法肉搏攻擊)
      c. 用CloseEnoughToUseSkill判斷是否夠技能施放距離,夠的話用IsPathClear判斷攻擊方向是否可通,是則轉Attack狀態,不通則轉NavigateObstacle狀態.

   2. 再遍歷執行m_PreloadQuestActionList中action.

上述都在【更祥細一點】中1。Character::UpdateSelf()中進行
接著會到【更祥細一點】中2。 Update subsystems:中的FollowPath()進行真正的移動處理.
posted @ 2012-08-13 10:09 flipcode 閱讀(363) | 評論 (0)編輯 收藏
dota中的道具/技能及動作狀態機 相關原型 設計備忘::
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// dota中的道具/技能及動作狀態機 相關原型 設計備忘::
/*
                                             flipcode@qq.com 的草案備忘(測試通過)
   商店用擁有很多kToyItem供購買,角色通過購買也可以得到很多kToyItem。
   kToyItem用于kToy物品類的顯示封裝,對應有一個物品類kToy以及儲存在哪個格子中,價格多少等信息。
   kToy中包含3種類型:1.kEquip(裝備),2.kUse(使用), 3.kSkill(技能)
   這3個類中各自包含一個listAction(動作列表),列表中存放的是kAction動作基類。
   kAction類中有Select()和IsValid()以及Execute()函數;
   1. kEquip中的Update()中調用listAction中每一個IsValid()函數來判斷是否執行對應的Execute();
      
   2. kUse中的Use()函數中調用listAction中每一個IsValid()函數來判斷是否執行對應的Execute();
   
   3. kSkill中的select()函數遍歷listAction中每一個Select()函數來判斷是否能選擇該技能,都通過才選擇。
      kSkill中的Start()函數中調用listActionStart中每一個IsValid()函數來判斷是否執行對應的Execute();
      kSkill中的Cast()函數中調用listActionCast中每一個IsValid()函數來判斷是否執行對應的Execute();
  說明:
  kSkill設計時考慮到施放前搖,故用了start()函數來播放前搖動作/特效,然后等待前搖時間完成再調用cast()函數來播放對應的施放動作/特效。
  當特效完成后再處理listAction(動作列表)。dota中還有后搖,我理解成技能冷卻時間(不知道對否),當cast()時,skill就可以開始冷卻了。
   [說明]
   角色屬性有:基礎屬性,附加屬性(直接+),加成屬性(*(1+比例)),而
   kAction的派生類kActionProperty專用于處理kEquip(裝備)提高屬性: 
   它用VARY_TYPE類型指明針對某種屬性, 如: str, int, dex, HP/MP(min/max), atk(min/max)。。。等.
   它用PROPERTY_METHOD區別是直接加還是比例乘:add/rate。
   這樣角色如果擁有kToyItem的話,那么在更新中就會調用每個物品的kEquip的Update,從而把屬性更新到角色的add_data[類型]和rate_data[類型]中,
   接著角色的更新就會用(base_data[]+add_data[])*(1+rate_data[])的公式來處理之(當然,dota的一些特殊的屬性使用另外的計算方法)
   kAction可以方便地擴充很多普通派生處理類,只要在相應的Execute()進行處理即可實現想要的功能,比如可能派生一個名為kActionHurt類,
   然后把它加入到kUse/kSkill中的listAction列表中,這樣只要點擊使用,即可Execute中處理加血/扣血。
   另外從kAction中派生的還有一些特殊類型:
   1. kActionEffect(包含listAction成員):
      kActionEffect執行Execute()時會調用全局的kEffectManager(特效管理器)的PlayEffect(effect_class_name)函數來產生一個kEffect的派生類對象, 并轉讓listAction給它。
      kEffectManager用來管理listEffect列表,更新處理其中每一個kEffect。
      kEffect類中包含一個listAction(動作列表)指針,它是由kActionEffect在產生它時傳遞過來的,這樣在特效完成并且條件成立時(比如命中敵人)調用listAction中每一個IsValid()函數來判斷是否執行對應的Execute();
   2. kActionState(包含listAction成員):
      kActionState執行Execute()時會調用全局的kStateManager(狀態管理器)的PlayState(state_class_name)函數來產生一個kState的派生類對象, 并轉讓llistAction給它。
      kStateManager用來管理listState列表,更新處理其中每一個kState。
      kState類中包含一個listAction(動作列表)指針, 它是由kActionState在產生它時傳遞過來的,這樣在該狀態完成時會調用listAction中每一個IsValid()函數來判斷是否執行對應的Execute();
  注意: kState隊列的執行優先于kAIState隊列,只有kState列表為空時,kAIState才有機會執行.
  關于kState和kAIState的區別:
  a. 動作觸發的狀態機:
  kState主要是kAction(動作)觸發引起角色的一些臨時被動行為,比如kState被擊退狀態,被暈狀態,狀態之間可以并行,或者串行(通過kState中的listAction列表掛接,在kState完成時遍歷調用listAction)。
  比如:
     可以將kActionHurt加入到kStateStun(被暈)狀態中的listActon中,然后再把kStateStun加到kStateThrustBack(被擊退)中,然后再把kStateThrustBack加入到kShotEffect的listAction中,接著給kActionEffect設置對應的kShotEffect
  并把kActionEffect加入到kToy中的kSkill的listActon中.這樣,當技能使用時就會觸發一個kActionEffect播放kShotEffect,這個kShotEffect播放完成時會觸發kStateThrustBack將角色擊退到一邊,退到一邊完成后接著觸發kStateStun讓角色暈上一會。
  而如果前面的kShotEffect是范圍特效的話,那在特效傷害范圍的角色都被擊退后再暈上一會(由于擊退和暈是動作狀態優先于角色的AI狀態,所以這時角色的AI是不運行的,只有等擊退后暈完了AI才醒過一繼續)。
  b. AI行為狀態機:
  kAIState主要是由kAIBrain(大腦)思考引起的一些主動的AI行為,比如kAIRoam漫步, kAIPursue追捕等,各AI狀態之間不能并行或串行只能切換。在任何時候包括在kAction的處理中也可以進行角色的kAIState切換。
  
   3. kActionTrigger:
      kActionTrigger中擁有一個事件名稱列表,當該action被execute時會通過kEventManager->PostEvent(Event_Name)來發出事件消息。這時事件監聽列表中的對應事件號的觸發器先判斷kCondition是否成立,是則調用相應的觸發器的kAction動作。
   關于觸發器:
   kTrigger觸發器,擁有listEventName, kCondition, kAction。事件管理器kEventManager可以創建kTrigger,并添加觸發器監聽的事件列表(listEventName),條件(kCondition),以及動作(kAction)。 
   當事件發生時可隨時調用kEventManager->PostEvent(Event_Name)來發出消息,事件的監聽者kTrigger先判斷kCondition是否成立,是則調用kAction。
   調用的kAction即前面所說的動作基類,當動作完成時可以再次PostEvent(...)以便觸發另外的觸發器。
   4. kActionPose:
      這個Action只是簡單地調用一下角色的動作播放。
   5. kActionSleep(包含listAction成員):
      這個kAction只是延遲一段時間,時間到了再調用listAction各成員的execute()函數.
   由以上設計可以知道每一個kToy道具均可以由不同的處理函數并行及串行(注意:這里說的串/并行跟多線程無關,概念不一樣)組合而成,這樣就可以實現動作或特效的串行/并發執行,以及觸發相應的處理。
*/
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
posted @ 2012-08-13 09:58 flipcode 閱讀(840) | 評論 (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 @ 2012-08-13 09:51 flipcode 閱讀(188) | 評論 (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 @ 2012-08-13 09:49 flipcode 閱讀(298) | 評論 (0)編輯 收藏
posted @ 2012-07-03 10:55 flipcode 閱讀(195) | 評論 (0)編輯 收藏

載圖,角色用的gunz模型測試:


界面用群雄逐鹿的測試:
posted @ 2012-05-10 15:29 flipcode 閱讀(183) | 評論 (0)編輯 收藏

posted @ 2012-04-01 20:04 flipcode 閱讀(213) | 評論 (0)編輯 收藏




圖:

posted @ 2012-03-23 21:26 flipcode 閱讀(206) | 評論 (0)編輯 收藏
僅列出標題
共8頁: 1 2 3 4 5 6 7 8 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久久久久久久一区| 国产喷白浆一区二区三区| 亚洲高清电影| 亚洲欧美日韩国产综合精品二区 | 国产精品美女午夜av| 欧美视频在线观看免费网址| 欧美国产一区视频在线观看| 欧美大片在线观看| 欧美日韩免费一区二区三区| 国产精品亚洲第一区在线暖暖韩国| 国产精品高潮呻吟久久av黑人| 欧美视频四区| 国产欧美日韩不卡免费| 国内精品国产成人| 在线成人av.com| 宅男精品视频| 久久青草久久| 亚洲高清在线精品| 亚洲女同在线| 久久琪琪电影院| 国产精品不卡在线| 亚洲国产精品va在线看黑人动漫| 亚洲欧洲日本国产| 久久成人久久爱| 91久久久亚洲精品| 性欧美1819sex性高清| 另类av导航| 国产精品美女久久久久久2018 | 国产精品私拍pans大尺度在线| 国产一区二区三区av电影 | 亚洲国产精品悠悠久久琪琪| 99视频在线观看一区三区| 久久九九久久九九| 欧美—级在线免费片| 国产精品一区二区久激情瑜伽| 在线观看欧美日韩| 欧美在线观看一二区| 亚洲精品美女在线观看播放| 久久精精品视频| 国产精品va在线播放我和闺蜜| 亚洲国产精品久久久久秋霞影院| 亚洲欧美国产精品桃花| 欧美黄色免费| 久久精品一区蜜桃臀影院| 国产精品国产三级国产a| 亚洲黄色毛片| 久久综合色一综合色88| 亚洲欧美日韩另类| 国产精品毛片在线看| 一区二区三区四区五区视频| 你懂的网址国产 欧美| 欧美一级在线播放| 国产精品网站一区| 亚洲乱码国产乱码精品精| 母乳一区在线观看| 亚洲午夜激情| 香蕉久久国产| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 狠狠色伊人亚洲综合网站色| 亚洲先锋成人| 日韩视频不卡中文| 欧美日韩国产在线| 99精品视频免费| 亚洲国产三级网| 欧美1区2区3区| 亚洲精选大片| 亚洲国产你懂的| 欧美激情一区二区三区四区| 亚洲国产精品热久久| 欧美高清在线观看| 欧美激情国产日韩精品一区18| 亚洲久久一区二区| 夜夜嗨av一区二区三区免费区| 欧美日韩国产不卡| 亚洲欧美日韩一区二区三区在线观看| 亚洲色在线视频| 国产视频在线观看一区二区| 久久综合给合久久狠狠色| 蜜臀av一级做a爰片久久| 日韩亚洲综合在线| 亚洲淫性视频| 亚洲国产成人精品女人久久久| 亚洲黄一区二区三区| 欧美午夜电影完整版| 欧美在线999| 另类亚洲自拍| 亚洲小少妇裸体bbw| 亚洲免费在线视频| 伊人成人网在线看| 亚洲精品乱码久久久久久黑人 | 亚洲欧美日韩国产中文| 国产在线拍偷自揄拍精品| 久久久综合网站| 欧美精品在线播放| 久久久久国产精品午夜一区| 模特精品裸拍一区| 羞羞答答国产精品www一本| 午夜久久tv| 亚洲乱码国产乱码精品精可以看| 中文欧美日韩| 91久久极品少妇xxxxⅹ软件| 99re66热这里只有精品4| 国产日韩欧美一区在线| 亚洲区第一页| 在线观看三级视频欧美| aa级大片欧美| 亚洲日本电影在线| 欧美制服第一页| 亚洲一区在线观看免费观看电影高清| 性欧美xxxx大乳国产app| 欧美 日韩 国产 一区| 免费久久精品视频| 亚洲在线免费视频| 欧美成年人网站| 久久久久国色av免费观看性色| 欧美国产丝袜视频| 麻豆久久婷婷| 国产女人精品视频| 一区二区不卡在线视频 午夜欧美不卡'| 国一区二区在线观看| 国产精品99久久久久久www| 亚洲精品欧美专区| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲视频免费在线观看| 蜜臀va亚洲va欧美va天堂 | 亚洲精品小视频在线观看| 久久精品亚洲热| 香蕉久久国产| 欧美日韩综合| 日韩视频永久免费观看| 亚洲日本乱码在线观看| 久久女同互慰一区二区三区| 久久精品人人| 国内精品伊人久久久久av一坑| 亚洲摸下面视频| 亚洲欧美日韩一区二区在线| 欧美日韩免费一区| 9l视频自拍蝌蚪9l视频成人| 一本色道久久99精品综合 | 欧美精品免费看| 91久久亚洲| av成人免费在线观看| 欧美精品一卡| 日韩一区二区免费看| 一区二区三区国产在线| 欧美日韩国产精品| 亚洲视频在线观看免费| 午夜精品美女久久久久av福利| 国产精品久久久久毛片软件 | 亚洲欧美高清| 久久爱www久久做| 一区二区三区在线视频观看| 久久久噜噜噜久久人人看| 欧美a级一区| 亚洲三级电影全部在线观看高清| 欧美成人亚洲| 亚洲桃花岛网站| 久久精品99国产精品酒店日本| 国内精品久久久久影院优| 久久夜色精品| 亚洲免费观看高清完整版在线观看熊| 亚洲视频一二三| 国产美女精品视频免费观看| 久久福利精品| 亚洲国产精品免费| 中文一区字幕| 国产一区二区三区在线观看免费视频| 久久精品视频在线| 亚洲黄色小视频| 亚洲在线日韩| 亚洲大片av| 国产精品qvod| 久久婷婷麻豆| 亚洲午夜精品一区二区| 欧美日韩国产一级片| 在线欧美影院| 99精品国产一区二区青青牛奶| 欧美日韩精品综合| 欧美一区二区三区视频在线观看| 女女同性精品视频| 亚洲欧美bt| 最新国产乱人伦偷精品免费网站 | 久久婷婷国产麻豆91天堂| 亚洲视频免费| 欧美韩日一区二区| 欧美一区二区三区免费看| 亚洲国产中文字幕在线观看| 国产精品日日做人人爱| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲一二三区在线观看| 欧美91大片| 欧美中文字幕在线播放| 亚洲精品日产精品乱码不卡| 国产主播一区二区| 欧美视频一二三区| 欧美激情综合五月色丁香| 久久伊人亚洲| 欧美一级网站| 性欧美xxxx视频在线观看| 日韩一区二区精品葵司在线|