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

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

関数を変数のように扱う

ゲームのキャラクタを状態に応じて動作を変えるような場合、C言語とかではif文やswitch文を使って処理を切り替えたりする。

void update() {
    switch( state ) {
        case WAIT:
            wait();
        case MOVE:
            move();
    }
}

C++ならデザインパターンのstateパターンやcommandパターンを使ったりするかな。
JavaScriptなら関数を変数のように扱うことができるので、実行したい関数を変数に代入することによって、簡単に動作を切り替えることができる。

wait: function() { ... }
move: function() { ... }

statechange : function() {
    if( ... ) {
        this.update = this.wait;
    } else {
        this.update = this.move;
    }
}

onenterframe : function() {
    this.update();
}

例えばこの例だと、update変数に実行したい関数を代入し、それが毎フレーム実行されるonenterframeで呼び出されている。あまり良くない例だけど、statechange関数で条件によって動作を切り替えている。C言語の場合は状態を表す変数(上の例ならstate)を用意して、その値に応じて切り替えていたのを、実行する関数を表す変数を用意して、それに直接関数を入れて実行するというイメージ。C言語だと状態が増えるたびに切り替える部分を書き加えないといけないが、JavaScriptならその必要がない。追加した関数を変数に代入するだけで良いので簡単。


12/12 追記
コメントでCやC++でも同じようなことが出来ることを教えてもらった。C++ではstd::functionがあり、Cでも関数ポインタを使えば同じようなことが実現できる。