ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

Command

メソッドを呼ぶということ自体をクラスにしてしまう。
あるクラスの処理を実行するにはクラスのメソッドを呼ぶ。その呼ぶということ自体をクラスで表現してしまうのがこのCommandパターン。あるクラスへの要求自体をクラスにしてしまえば、そのインスタンスを集めれば履歴として利用できる。クラスの種類を増やすことによって異なった要求にも対応できる。
CommandはEventと呼ばれることもある。GUIのアプリケーションを作成するときにでてくるイベントと同じ。
ゲームではAIの思考ルーチンをCommandで実装すると良いかもしれない。基本的で単純な行動、たとえば歩く、撃つ、防御するなどをコマンドとして実装し、それらを組み合わせて複雑な行動を実現する。そのコマンドを組み合わせる部分のインタフェースを実装すればユーザーが独自でAIを作り上げることも出来る。

// コマンドのインタフェース
public interface Command {
    public abstract void execute();
}
// 歩くコマンド
public class WalkCommand implements Command {
    public void execute() {
        // キャラを歩かせる処理
    }
}
// 撃つコマンド
public class ShotCommand implements Command {
    public void execute() {
        // 撃つ処理
    }
}
// キャラクター
public class Character {
    private Vector command;  // コマンドのリスト
    // コマンドを追加
    public addCommand(Command cmd) {
        cmd.add(cmd);
    }
    // 行動開始
    public start() {
        Iterator it = commmand.iterator();
        while(it.hasNext()) {
            Command cmd = (Command)it.next();
            cmd.execute();
        }
    }
}
// テスト
void doText {
    Character chara = new Character();
    // コマンドを登録
    chara.addCommand( new WalkCommand() ); // 歩いて
    chara.addCommand( new ShotCommand() ); // 撃つ
    // 行動開始
    chara.start();
}

※ソースはイメージを表したもので、実際にはこのまま入力しても動作しない。
Commandクラスにパラメータのメンバーを持たせても面白いだろう。ただ歩く、だけでなく何歩歩くとか。まあ、実際にはAIがこんな簡単に実装できるものではないけど、イメージとしてはこんな感じ。


参考文献:(旧版)Java言語で学ぶデザインパターン入門
参考:ギコ猫とCommandパターン