您好,登錄后才能下訂單哦!
回合制戰斗的技能實現
The limits of my language means the limits of my world ---- Ludwig Wittgenstein
我們游戲的邏輯部分是放在服務器端進行處理的,實際上前端所處理的僅僅是一個表現效果,可以說只是一個播放器。但實際上完全可以在本地加上一個邏輯模塊,將全部的邏輯放在本地處理。
一般來說,邏輯模塊處理技能之后,display模塊會得到如下數據
1.技能id
2.主動角色:戰場中的哪個角色釋放了技能 (實際上,這個擁有多個角色,實現出類似于合體技的效果,但是我們的項目沒有這類的需求,故只處理了一個)
3.被動角色組:戰場中哪些角色被主動角色發動的技能施加了影響 (是傷害?還是治療?還是增加了一個buff?)
我們先看一下我們第一版的戰斗技能實現方式,最原始的版本,這里以近戰和遠程***為例
1.通過技能id讀表獲得此技能的類型 (是近戰還是遠程,還是全體)
2.卡牌移動到目標前方
3.卡牌播放***動作
4.卡牌播放動作同時,在卡牌前播放特效
5.特效的傷害幀播放受擊卡牌的受傷動畫
6.卡牌歸位,下一輪
遠程***
1.卡牌播放放波動作
2.特效從我方卡牌飛向目標卡牌(可能有多個)
3.特效關鍵幀觸發后,被擊卡牌播放受傷動畫
4.卡牌動作歸位,下一輪
全體***同上,只是取敵方陣正中央播放一個全體特效
......
這個原始版本有如下的幾個弊端
1.每類技能都需要單獨了一套實現,類似于飛行時間此類的細節可以通過增加技能參數來實現,但是實現類似于打橫排,打豎排之類就需要新增加一種技能類型,big class bang!
2.即便是同類***,也需要處理很多小的細節。
例如:
某遠程技能需要在釋放時,先播放一個特效,然后再將飛彈打出去。
某近戰技能需要在目標卡牌前播放一個蓄力動畫再發動***。
某全體技能需要釋放者先走到屏幕中央,然后再播技能特效,而另一個技能則是走到敵方陣營的正中央
......
3.修改怎么辦?如果某些技能需要改變,策劃們會屁顛屁顛地跑過來,很開心得指出你的細節問題,然后各種不相關的人也過來巴拉巴拉巴拉....能tm把人給煩死,這種痛苦大家都懂得
以上幾個重大缺陷最終迫使我放棄了第一版的戰斗實現,雖然當時的戰斗復雜程度已經和目標游戲《放開那三國》差不多了,但是實在是可擴展性極差,不得已,推倒原設計轉入了第二版。
第二版的設計目標
經歷了第一版的慘痛經歷,我為第二版設定了如下的設計目標
1.策劃可以通過配表,獨立實現技能權利 (沒事不準來煩我!)
2.高度抽象,將全部的實現抽象為幾個類,避免繼續第一版類爆炸 (功能內聚)
3.針對特性編程,不針對實現編程,不搞特殊化技能的代碼實現 (給你工具,自己實現)
實際上這幾個需求的目標是完全一致的,即,實現一個技能的工具箱,策劃通過獨立組合卡牌和特效的動態效果,來獨立配置技能。先重新分析下第一版的戰斗。
近戰戰斗
1.通過技能id讀表獲得此技能的類型 (...)
2.卡牌移動到目標前方 (卡牌移動了)
3.卡牌播放***動作 (卡牌播放了一個動作)
4.卡牌播放動作同時,在卡牌前播放特效 (卡牌播放了一個動作,產生了一個特效)
5.特效的傷害幀播放受擊卡牌的受傷動畫 (產生了一個特效)
6.卡牌歸位,下一輪 (卡牌移動了,技能結束了)
抽象地語義分析一下,這里面有這么幾個簡單的過程:
1.卡牌移動了
2.卡牌播放動作了
3.產生了技能特效
4.技能結束了
進一步分析會發現:卡牌移動和卡牌播放動作完全可以合并成同一個,卡牌動作
我們可以視
卡牌原地不動播放做動作是卡牌動作的一個特例
卡牌移動但是不播放動作也是卡牌動作的一個特例
這樣過程就抽象為
1.卡牌動作
2.產生了技能效果
3.技能結束
這三個過程
這時候再分析遠程
遠程***
1.卡牌播放放波動作 (卡牌動作)
2.特效從我方卡牌飛向目標卡牌(產生了技能特效,技能特效移動了)
3.特效關鍵幀觸發后,被擊卡牌播放受傷動畫 (卡牌動作,產生了一個技能特效)
4.卡牌動作歸位,下一輪 (卡牌動作,技能結束)
同上面的分析,我們會發現,技能特效的產生和移動同樣可以合并成一個,即技能效果,靜止技能是移動技能的一個特例
所以最終我們的技能工具箱里只剩下了三個抽象工具
1.卡牌動作 (移動和動作)
2.技能效果 (創建和動作)
3.技能結束 (技能結束)
也就是說,近戰***和遠程***都是由這三個過程組合而成的,之前沒有提到的全體技能也可以進行此類分析
1.卡牌播放了施法動作 -> 卡牌動作
2.卡牌上方播放了施法特效 -> 技能效果
3.目標卡牌組上播放全體特效 -> 技能效果
4.目標卡牌組上播放受傷特效 -> 技能效果
5.技能結束 -> 技能結束
使用工具箱中的三種描述,是完全有可能實現的!
在這里我們假象一種相對復雜的技能:
主動卡釋放了一組飛彈,命中了全體敵人,然后移動到敵方陣營正中央,釋放了一個全屏幕特效的全體技能,最后從屏幕的最后方,召喚了一只老鷹(特效),飛到敵人后方且***了全部敵人
分析如下:
1.主動卡施法動作 -> 卡牌動作
2.釋放一組飛彈-> 技能效果
3.主動卡移動到敵方陣營正中間 -> 卡牌動作
4.敵方正中央播放全體技能特效 -> 技能效果
5.特效觸發幀,敵方全體卡牌播放受傷動畫 -> 卡牌動作
6.創建老鷹特效,從我方屏幕后方移動到敵方后方 -> 技能效果
7.老鷹特效觸發幀播放受傷特效 -> 卡牌動作
8.主動卡歸位 -> 卡牌動作
9.技能結束 -> 技能結束
可以看到基本滿足了要求,所以我們可以從語義上對回合制游戲的大部分技能進行完全的抽象描述了
接下來,就是對下面三個工具的實現描述
表結構
依上所述,卡牌動作主要分兩部分,一個是卡牌的動畫動作,另外一個是卡牌執行的位移。
卡牌動畫動作
我們使用的是cocostudio實現的動畫,每個卡牌的動畫都是封裝好的,執行某個動作策劃只需要將當前卡牌執行的動作名填表即可
卡牌的位移
位移相對麻煩一些,因為我們不可能讓策劃詳細填寫坐標吧?但是實際上,卡牌位移可能出現的起始位置是一個有限集,是完全可以預定義的,如下
1.主動卡原位置
2.目標卡位置(目標卡一般是個卡組,這個返回的是第一個)
3.目標卡組列位置 (取第一張卡,然后根據位置算出當前的列位置)
4.目標卡組行位置 (同上)
5.屏幕正中央
6.我方后方
7.敵方后方
8.敵方正中央
....
以上列舉一些可能卡牌位置,具體實現時,可以靈活添加。
舉一個實際的例子,某個卡牌動作是,從主動卡原位置移動到屏幕正中央(0.5秒),且播放移動動作(walk),策劃填卡牌動作表如下,move代表的是起始位置
cardMove.xlsx
id | act | move | time |其他 ...
---------------------------
1 | walk | [1,5] | 0.5 |其他 ...
*這里的act下填寫的是卡牌的動作名稱
這樣當技能的狀態機執行到這兒的時候,就知道該如何移動了
同理,一個老鷹特效從屏幕后方飛刀敵方中央(0.5),策劃填表特效表如下
effect.xlsx
id | file | move | time |其他 ...
---------------------------
1 | eagle| [6,8] | 0.5 |其他 ...
*這里的file下填寫的使用的動畫文件的名字
技能狀態機依次讀取對應的結構然后播放就可以了....
等等! 還沒有講調用!
是的!
調用也很簡單
cardMove.xlsx
id | act | move | time | callback | ...
--------------------------------------------
1 | walk | [1,5] | 0.5 | [effect,1] |
id | act | move | time | callback | ...
--------------------------------------------
2 | walk | [5,1] | 0.5 | [over,1] |
effect.xlsx
id | file | move | time | callback |
--------------------------------------------
1 | eagle| [6,8] | 0.5 | [cardMove,2] |
簡單的流程就是:
cardMove[1] -> effect[1] -> cardMove[2] -> over
這個的實現方式有點類似于鏈表,callback指定了技能狀態機下一個執行的函數,一直執行到 over 為止,技能狀態機開始執行下一個技能。
實際上的cardMove表和effect表遠比這要復雜,在實際的項目中,我們的callback是一個帶延遲時間的數組 如下:
[[1.5,[cardMove,2]],[1.5,[effect,2]],[1.0,[effect,3]]]
這條callback延時調用了三個函數,實現了一個卡牌移動和兩個技能特效,而前面的數值則是延遲調用的時間,這種多重調用可以制造天女散花類的效果
大家可以考慮下下面這個技能效果如何通過配表實現
主動卡發射了一個飛彈,命中了屏幕正中央,引發一次爆炸特效,之后從爆炸特效發射出六個飛彈命中了敵方的六個目標。
后期有時間會把示例代碼發出來,基于quick cocos2dx的 lua實現。
應某友要求,接下來將會嘗試使用此套類似的機制,嘗試實現LOL中的部分技能效果,使策劃能夠自由配置想要的技能效果。
個人認為,只要能夠用語言描述出來的技能,必然能夠配置實現。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。