引擎:CocoCreator2.1.0
語言:TypeScript
Git倉庫地址:https://github.com/superXfx/GameDesignPatterns.git
定義——
為“宿主”帶來增益(Buff)或損害(Debuff)银伟,效果多是持續(xù)的并可被疊加。
類圖——
從類圖可以發(fā)現(xiàn)泞遗,BuffBase包含所有屬性均驶,具體buff只需要繼承它為需要的幾個屬性賦值粘招,重寫Action()函數即可。
BuffMgr是管理者,注意它不是單例吨掌。因為每個Hero都會有獨立的Buff系統(tǒng),100個Hero就有100個Buff系統(tǒng)實例脓恕。
BuffFactory的作用是將BuffMgr和具體Buff類解耦膜宋。
接下來看代碼
1、基類BuffBase
通過上面幾個屬性炼幔,控制buff的 持續(xù)時長秋茫,是否多次觸發(fā),是否允許疊加等特性乃秀。
在子類中為其賦值即可肛著。
幾個關鍵的函數,創(chuàng)建時調用Action()跺讯;失效時調用Exit()枢贿;
至于getAttr()比較有趣,它返回其影響的屬性值的增(減)量刀脏,假設此buff效果是速度+10%局荚,那么函數體中寫
switch(attrType)
{
case Const_All.eAttrType.eSpeed:
return hero.speed * 0.1;
break;
};
2、具體Buff
<1>BuffSpeedUp
通過mLiveTime和mMaxCount很簡單的設置了buff的持續(xù)時間和疊加層數
因為它是數值類buff愈污,所以實現(xiàn)getAttr()并返回值耀态。
<2>BuffChangeHero
這是個“效果類”buff——改變hero外形。
注意它通過實現(xiàn)mGroup钙畔,mClashGroup實現(xiàn)了同時只能有一個變形buff的目的——與任何“變形”buff互斥茫陆。
然后它實現(xiàn)Action(),Exit()控制“變形”即可擎析。
3簿盅、BuffMgr
驅動buff系統(tǒng)挥下,無甚可講。
createBuff中可以看到一些實現(xiàn)細節(jié)——層級疊加 和 移除沖突buff桨醋。
——與hero結合——
1棚瘟、因為可能會有多個hero,多個敵人喜最。他們都可能有自己的一套buff掛在身上偎蘸。
所以BuffMgr不能是單例,它應該是每一個hero/敵人 掛一個BuffHero實例瞬内。
如圖
2迷雪、當外部調用Hero的屬性時,應該檢索buff虫蝶,算上收益/損失值章咧。
如圖
綜上,Buff系統(tǒng)全部講完能真,具體到單個buff的實現(xiàn)赁严,代碼是很少的——在啰嗦一遍就是 對擴展開放,對修改關閉粉铐。
題外話——
在讀《HeadFirst設計模式》疼约,《整潔代碼之道》,以及做項目的時候蝙泼。
經常有種“好的編碼原則 生長出 好的設計模式”的體會程剥。
例如單一職權,開閉原則等等踱承,如果踏實的踐行倡缠,在回頭看時哨免,會發(fā)現(xiàn)可能已應用幾個經典的設計模式茎活。
我建議讀一讀上面兩本書,它們是編寫優(yōu)雅代碼路途中的燈塔琢唾。
下一篇载荔,游戲設計模式 之 AI_行為樹
http://www.reibang.com/p/9a8ebf1f9419