Game Programming Patterns 阅读笔记 2

回顾 Command 命令模式

什么是命令模式

  • GoF对命令模式的一种解释:

命令模式是一种回调的面向对象实现

  • 感觉这个解释十分到位,命令模式就是面向对象版本的:C里的函数指针,Javascript的闭包,Python里作为一等公民的函数,Gdscript里的Callable

三个例子

  1. 作者以输入绑定为例,使用这个模式之前,一个按键写死了对应一个动作(比如按下'W'就是跳跃,按下'A'就是攻击),而命令模式为其添加了一层间接寻址

  2. 还有增强操控角色灵活度的例子,通过给命令传入角色的引用可以方便的在运行时切换可操作的角色。这对于做多人对战、附身、玩家角色自动演示,角色AI很有帮助

  3. 方便的实现撤销(Undo)、重放(Replay)操作,在策略游戏/SRPG里很常用。就是记住命令执行之前的状态,以期未来可以恢复这种状态来实现撤销。

    • 另一种方法是持久化旧的状态,新的状态持有旧状态对象的引用,一旦想要撤销就切换到旧状态对象

In some ways, the Command pattern is a way of emulating closures in languages that don’t have them.

命令模式只是在模拟函数式语言的闭包

// Javascript

function makeMoveUnitCommand(unit, x, y) {
  // This function here is the command object:
  return function() {
    unit.moveTo(x, y);
  }
}

function makeMoveUnitCommand(unit, x, y) {
  var xBefore, yBefore;
  return {
    execute: function() {
      xBefore = unit.x();
      yBefore = unit.y();
      unit.moveTo(x, y);
    },
    undo: function() {
      unit.moveTo(xBefore, yBefore);
    }
  };
}

另见

  • 在基类里面实现一些高层方法会有帮助
  • 责任链模式(分配命令)
  • 无状态的命令可以用 ”享元模式 (Flyweight)“ 节约内存,共用实例

引用