看了所有的回答,都把焦點放在了「如何判定在背後」,其實這只是一個初中算數的問題,那麽思考一個問題——這幾個人的攻擊恰好是近戰攻擊,我們是否允許設計一個英雄,他也有「任何傷害背後攻擊必爆」的特性,但是他的4個技能是:
1,向前丟出一個回力標,飛到一定距離後折返,類似LoL的輪子媽的Q,策劃要求「如果背後命中敵人則必爆」。
2,在身邊召喚雷電球順時針環繞自己,擊中敵人後會爆炸,策劃要求「如果從背後擊中敵人則必爆」。
3,飛出魚叉,抓住一個目標並拽回,目標被拽回的路徑上的敵人碰到目標都會受到傷害,策劃要求「如果目標被拽回時,從背後撞擊了路徑上的人,則此傷害必爆」。
4,大招:在遠處召喚8道水柱,水柱順時針螺旋向中心(即釋放技能時候角色的位置)移動,對碰到的敵人造成傷害,對碰到的友軍造成治療,策劃要求「如果是從正面碰到友軍則治療必爆,如果時從背後碰到敵人則傷害必爆。」
思考一個問題——以上四個需求為什麽不可以?那麽問題來了!—— 這4個傷害的「背後判定」,一定與「我」(釋放這個技能的人)的位置有關嗎 ?所以我想說,樓上的大多是紙上談兵,那麽作為一個實際幹出過數款上線並有幾款成績不錯的Moba遊戲的我就從最簡單的實作來談談這個在真實的Moba遊戲中是如何實作的。
在這個問題中,涉及到的數據以及他們的最基礎內容:
1,CharacterObj(角色物件),有一個內容面向(FaceDirection),為了編寫lua指令碼的策劃便於理解,我們通常使用0-359的整數,描述了一個角色面向的角度,這裏還要註意一點——在很多遊戲設計的需求下,面向的角度不等於角色移動的方向的角度,你可以根據需要把面向(FaceDirection)和移動角度(MoveDirection)做一個分家,但是這個問題下,我們關註的只是FaceDirection。
2,DamageInfo(傷害資訊),通常新手會認為這個是一個多余的環節,但是如果你真的理解了我的buff機制(你可以從知乎搜尋「如何設計一個易擴充套件的遊戲技能系統」),你會發現整個流程中這是一個必要的東西。首先我們來說DamageInfo通常包含的內容(與本次討論無關的內容就不再這裏列出了,根據計畫的實際需求擴充套件這個結構就行了):
1)Damage: 通常在Moba中是int,如果你還會用到金木水火土等內容傷害,那麽可以把它定位Array,如果你是傳統頁遊,那int其實很難滿足你的需求。無論如何,你需要一個地方暫時記錄這次傷害的值。
2)isHit:boolean,是否命中,是否能夠命中並不影響造成的傷害,傷害管傷害(Damage)計算值,會影響最後命中的因素非常多,所以這裏只記錄當前傷害資訊能否命中。
3)isCritical:boolean,是否暴擊,同是否命中,你不應該因為暴擊了直接就把Damage進行運算,我們說DamageInfo這個資訊用於最後的傷害計算,所以最後實際算傷害的時候,會根據DamageInfo.damage和DamageInfo.isCritical得出一個合適的傷害數位的。
4)degree:int,0-359,傷害來源的角度,這個角度就是當前問題的關鍵,由於遊戲中有太多的因素會產生傷害,所以每一個因素在產生傷害的時候都會有不同的賦值方式,因此這裏會涉及到另外一個課題——將傷害來源做個抽象歸類,合理的設計下應該是這樣的: