游戲設計模式 之 策略模式

strategy.gif

引擎:CocoCreator2.1.0
語言:TypeScript
Git倉庫地址:https://github.com/superXfx/GameDesignPatterns.git

定義——
封裝算法,并可在運行時切換,切算法的變化獨立于其的使用者。

此demo中使用 策略模式 來處理英雄“變身”時兩種不同的移動邏輯。
即Move行為獨立于Hero,將Move于Hero解耦,并可以在運行時切換。

類圖——


Strategy.jpg

從類圖中可以發(fā)現,從MoveBehavior類派生出MoveNormal和MoveRotation兩個Move的具體類。
Hero持有MoveBehavior的引用并可在運行時用具體類賦值它,從而切換行為。

接下來看看代碼具體實現
1、基類 MoveBehavior


image.png

2、派生類,MoveNormal,MoveRotation


image.png
image.png

從代碼可以看出:
1>update()方法是move行為真正執(zhí)行的地方,派生類繼承并實現update來實現自己的move行為。
2>setDir(dir)方法則是設置移動方向
3>至于packParam(),unPackParam(dt)比較有趣,它是用來在切換行為時,“繼承”上一個行為的參數用的。
在這里就是dir參數,即切換move行為后保持方向不變



接下來看看move行為的擁有者Hero,以及對Move行為的具體使用方法。


image.png
image.png

1>首先Hero持有一個Move行為的引用,即MoveBehavior,顯而易見。
2>在changeHero中會動態(tài)的切換Move行為,
即this.mMoveInterface = new MoveNormal(this); 或 this.mMoveInterface = new MoveRotation(this);
非常簡單,簡潔優(yōu)雅的就改變了Hero的行為。
另外切換前使用packParam(),unPackParam(data)傳遞參數。
3>前面說過,真正的move行為在update中實現,那么在Hero的update中驅動Move行為的update即可。

至此,策略模式 在Hero移動上的應用已經全部完成,可以發(fā)現兩個很棒的優(yōu)點:
1、Move行為與Hero解耦。
這意味著Move行為可以應用在任何可移動體上。比如敵人甚至炮彈上。
2、當有新的Move行為時,可以做到“對擴展開放,對修改關閉”原則
只需實現一個新的行為類——此處是擴展開放。
而不需要修改任何現有代碼——此處是對修改關閉。

下一篇,游戲設計模式 之 觸發(fā)器
http://www.itdecent.cn/p/8427617be61e

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容