Commandパターン

design-pattern-command.png

命令をまとめたクラス

ゲームでコマンドパターンを実装するなら

GOF公式ではundo()関数を持つ、となってますが
ゲームで実装するんだったらundo()は必ずしも必要ではありません。

class Command{
    public abstract void execute();
}

これを実装したクラスはこんなかんじになります
class JumpCommand extends Command{
    @Override
    public void execute(){ jump();}
}

ゲームで、ゲームパッドの入力などを扱うInputHandlerクラスを作ったとすると、
そのInputHandlerクラスに、Commandクラスへのポインタを持たせるようにします

undo()関数

アクションゲームなどでは必ずしもundo()は必要ありませんが、戦略系ゲームだったらundoは必要です。
undo機能はコマンドパターンを使わないと実装がとても難しくなります

undo()の実装例

class Command{
    public abstract void execute();
    public abstract void undo();
}
class MoveUnitCommand extends Command{
    Unit mUnit;
    int mXBefore;
    int mYBefore;
    int mX;
    int mY;
    public MoveUnitCommand(Unit unit,int x,int y){
        mUnit=unit;
        mXBefore=x;
        mYBefore=y;
        mX=x;
        mY=y;
    }
    @Override
    public void execute(){
      mXBefore=mUnit.x();
      mYBefore=mUnit.y();
      mUnit.moveTo(mX,mY);
    }
    @Override
    public void undo(){
       mUnit.moveTo(mXBefore,mYBefore);
    }
}

redo機能

undo,redoをいっぱい行うようなものだったら、
コマンドをある程度リストで保持しておく必要があります。
あんまりたくさんリストで溜めすぎるとメモリを消費しますが、
GIMPのhistoryみたいなものですね

リプレイ機能にCommandオブジェクト

ゲームのリプレイ機能を実装するには、
このCommandオブジェクトのリストを保存しておくと良いでしょう。
リプレイするときは、保存したコマンドを入れて、リプレイさせます

Bibliography
1. Game Programming Patterns (English Edition)….ゲームプログラミングでデザインパターンをどう取り入れるのかを、著者の経験を交えて実践的に書いてあります

command delegation game-design-pattern

サポートサイト Wikidot.com commanddelegationgame-design-pattern