游戏编程模式- 命令模式
命令模式
命令是具象化的方法调用
把方法调用封装起来。通过封装方法调用,可以把运算快封装成形,所以调用此运算对象不需要知道事情是如何进行的。通过封装方法调用,可以实现一些很聪明的事,比如建造类游戏或者编辑器中的重做和撤销,日志记录,记录玩家的一句游戏中发起的命令来实现对局回放的功能。
通俗一点来说,举一个例子,作为一个带兵打仗的将军,我们需要指挥军队派兵布阵,当我们需要训练一个叫做长蛇阵的阵型,需要士兵配合从一个正方形方阵变换到长条型方阵,然而作为将军我们并不想了解具体哪一个士兵需要从哪个位置移动到另一个位置,我们只希望当我发出长蛇阵的集结命令时,最终能够形成这个阵型。如果对长蛇阵之中一些士兵位置不满意,我们可以任意调整他们的位置,不管怎么调整,将军任然只需要发出同样的命令。在这个过程中,也可以感觉到命令模式可以有助于我们复用代码,例如可以用于AI的状态机实现。


假设我们有如下的的需求,当用户分别按下XYAB的按键时,会触发跳跃,射击,切换武器等逻辑,一种常用的做法如下所示,这时候策划有一个需求,希望支持玩家可以自定义按键

采用命令模式之后,达到的效果应该如下


简单地实现以上的例子,代码如下
普通的实现思路
命令模式
撤销和重做
撤销最后一条命令或者多重撤销是常见需求,使用命令模式将会使其变得非常简单。
增加Redo 和Undo的实现,根据命令的具体情况设置用于记录之前状态的变量,例如执行移动命令的之前,存储一个当前位置用于Undo等等。多重撤销的实现也非常简单,我们只需要记录一个命令队列,根据当前的Index来执行对应的逻辑即可。
