游戲編程模式- 命令模式
命令模式
命令是具象化的方法調(diào)用
把方法調(diào)用封裝起來。通過封裝方法調(diào)用,可以把運算快封裝成形,所以調(diào)用此運算對象不需要知道事情是如何進行的。通過封裝方法調(diào)用,可以實現(xiàn)一些很聰明的事,比如建造類游戲或者編輯器中的重做和撤銷,日志記錄,記錄玩家的一句游戲中發(fā)起的命令來實現(xiàn)對局回放的功能。
通俗一點來說,舉一個例子,作為一個帶兵打仗的將軍,我們需要指揮軍隊派兵布陣,當我們需要訓(xùn)練一個叫做長蛇陣的陣型,需要士兵配合從一個正方形方陣變換到長條型方陣,然而作為將軍我們并不想了解具體哪一個士兵需要從哪個位置移動到另一個位置,我們只希望當我發(fā)出長蛇陣的集結(jié)命令時,最終能夠形成這個陣型。如果對長蛇陣之中一些士兵位置不滿意,我們可以任意調(diào)整他們的位置,不管怎么調(diào)整,將軍任然只需要發(fā)出同樣的命令。在這個過程中,也可以感覺到命令模式可以有助于我們復(fù)用代碼,例如可以用于AI的狀態(tài)機實現(xiàn)。


假設(shè)我們有如下的的需求,當用戶分別按下XYAB的按鍵時,會觸發(fā)跳躍,射擊,切換武器等邏輯,一種常用的做法如下所示,這時候策劃有一個需求,希望支持玩家可以自定義按鍵

采用命令模式之后,達到的效果應(yīng)該如下


簡單地實現(xiàn)以上的例子,代碼如下
普通的實現(xiàn)思路
命令模式
撤銷和重做
撤銷最后一條命令或者多重撤銷是常見需求,使用命令模式將會使其變得非常簡單。
增加Redo 和Undo的實現(xiàn),根據(jù)命令的具體情況設(shè)置用于記錄之前狀態(tài)的變量,例如執(zhí)行移動命令的之前,存儲一個當前位置用于Undo等等。多重撤銷的實現(xiàn)也非常簡單,我們只需要記錄一個命令隊列,根據(jù)當前的Index來執(zhí)行對應(yīng)的邏輯即可。
