• <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 閱讀(829) 評論(0)  編輯 收藏 引用
            91超碰碰碰碰久久久久久综合| 久久九九久精品国产| 色天使久久综合网天天| 亚洲精品第一综合99久久| 亚洲伊人久久精品影院| 国产成人久久AV免费| 国产精品激情综合久久| 亚洲人成无码www久久久| 无码人妻久久一区二区三区| 成人国内精品久久久久一区| 66精品综合久久久久久久| 欧美一级久久久久久久大片| 99精品国产综合久久久久五月天| 91久久精一区二区三区大全| 久久久中文字幕日本| 亚洲乱码中文字幕久久孕妇黑人| 久久久久久综合一区中文字幕| 亚洲欧洲精品成人久久曰影片 | 人妻中文久久久久| 国产精品久久久久久久久| 国产精品VIDEOSSEX久久发布| 亚洲国产综合久久天堂 | 2021久久精品免费观看| 久久精品国产一区二区电影| 亚洲性久久久影院| 久久99国产精品99久久| 久久亚洲精品国产精品| 久久久亚洲精品蜜桃臀| 天天综合久久久网| 久久AV高清无码| 亚洲国产另类久久久精品黑人 | 久久夜色精品国产噜噜麻豆| 久久综合狠狠综合久久综合88| 免费一级做a爰片久久毛片潮| 91精品观看91久久久久久| 69SEX久久精品国产麻豆| 久久精品国产亚洲AV麻豆网站| 亚洲精品无码专区久久久| 人妻无码精品久久亚瑟影视 | 久久无码AV一区二区三区| 人妻无码中文久久久久专区|