• <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)  編輯 收藏 引用
            婷婷国产天堂久久综合五月| 香蕉99久久国产综合精品宅男自| 日韩AV毛片精品久久久| 综合久久给合久久狠狠狠97色 | 青青青青久久精品国产| 91精品国产综合久久香蕉 | 久久精品国产色蜜蜜麻豆| 国产欧美久久久精品影院| 久久精品国产亚洲77777| 91麻精品国产91久久久久| 久久久久久久免费视频| 狠狠狠色丁香婷婷综合久久俺| 国产激情久久久久影院老熟女免费 | 91麻豆国产精品91久久久| 久久青青草原国产精品免费| 久久伊人精品一区二区三区| 99久久www免费人成精品| 亚洲中文字幕久久精品无码喷水| 嫩草影院久久99| 亚洲女久久久噜噜噜熟女| 青青热久久国产久精品 | 一本色道久久88综合日韩精品| 国产精品美女久久久久| 精品久久久久久国产| 久久久久久A亚洲欧洲AV冫| 久久精品国产亚洲AV无码麻豆 | 天天综合久久久网| 人妻无码久久一区二区三区免费| 欧美粉嫩小泬久久久久久久| 午夜不卡888久久| 久久精品国产精品国产精品污| 亚洲国产精品无码久久一线| 久久一区二区三区99| 久久精品国产一区二区三区不卡 | 精品久久久久久成人AV| 久久婷婷色综合一区二区| 久久只这里是精品66| 国产精品久久新婚兰兰 | 91精品久久久久久无码| 国产 亚洲 欧美 另类 久久| 国产精品99久久不卡|