• <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>
            posts - 72,  comments - 4,  trackbacks - 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 on 2012-08-13 09:58 flipcode 閱讀(831) 評論(0)  編輯 收藏 引用
            午夜精品久久久久久| 久久亚洲精品中文字幕三区| 亚洲人成网站999久久久综合 | 亚洲精品无码久久千人斩| 波多野结衣久久一区二区| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 狠狠综合久久综合88亚洲| 性欧美丰满熟妇XXXX性久久久 | 久久久久久亚洲精品影院| 天堂久久天堂AV色综合| 久久精品国产一区二区电影| 亚洲熟妇无码另类久久久| 国产精品免费久久久久影院| 久久综合国产乱子伦精品免费| 久久亚洲国产精品123区| 久久99精品久久只有精品| 午夜精品久久影院蜜桃| 久久夜色精品国产亚洲| 午夜精品久久久久久99热| 久久久久97国产精华液好用吗| 国产精品久久久久aaaa| 久久精品国产精品亚洲精品| 国产亚州精品女人久久久久久 | 国产AⅤ精品一区二区三区久久| 香蕉久久夜色精品国产尤物| 国产福利电影一区二区三区久久老子无码午夜伦不 | 伊人色综合久久天天人手人婷| 精品久久久久久无码人妻热| 国产精品久久久久天天影视| 狠狠色狠狠色综合久久| 欧美国产成人久久精品| 一本大道久久东京热无码AV| 欧美与黑人午夜性猛交久久久| 精品国产乱码久久久久久浪潮| 久久久精品免费国产四虎| 精品一区二区久久久久久久网站| 久久久久亚洲AV片无码下载蜜桃| 亚洲va国产va天堂va久久| 人妻精品久久无码区| 久久av无码专区亚洲av桃花岛| 久久精品欧美日韩精品|