関数を指し示す変数を作るためには、関数型のポインタを作ります。
関数を指し示す変数を使うと何が便利かというと、たとえばシューティングゲームの敵キャラクターを作る際、 Enemy という構造体ひとつを使い回して、いろんな敵キャラの移動パターンや思考ルーチンを作れるようになります。
typedef struct Enemy { int x, y, width, height; void Study::Bitmap graphics; void (*moveAI)(struct Enemy *); // ←移動ルーチンを担当する関数を指し示す変数 } Enemy; // 敵キャラを格納する場所を作る Enemy enemies[MAX_ENEMY]; // 敵1を初期化 enemies[i].moveAI = MoveEnemyTypeA; // 敵2を初期化 enemies[i].moveAI = MoveEnemyTypeB; // 敵3を初期化 enemies[i].moveAI = MoveBoss; // 敵1が呼び出す関数 void MoveEnemyTypeA(struct Enemy *enemy) { } // 敵2が呼び出す関数 void MoveEnemyTypeB(struct Enemy *enemy) { } // 敵3が呼び出す関数 void MoveBoss(struct Enemy *enemy) { } // 敵キャラを動かす for (int i = 0; i <MAX_ENEMY; i++) { enemies[i].moveAI(&enemies[i]); // ↑たったこれだけで、敵キャラごとに呼び出される関数が変わる!! // 敵1の場合は MoveEnemyTypeA() 、 // 敵2の場合は MoveEnemyTypeB() 、 // 敵3の場合は MoveBoss() }
ちょっと上級編かもしれませんが、この手法はオブジェクト指向にも応用できますので、サンプルプログラムなどでの使われ方をよくみておきましょう。
Comments
知りませんでした!!ww
できたら便利だなって思ってたんですけど…
どう調べて良いのかわからなくて…
ためになりました。
早速プログラムに組み込んでみます!!
ありがとうございます
自分の読んだタスクシステムの本はこれを使ってました
標準でしょうか?
> OMEGA さん
> yomogi さん
自分は関数へのポインタは上級技だと思うのですが、
わりと書籍などでは例に挙がるため結構使われていると思います。
でも、用途がわかるとそれほど難しくないですよね。
Contributions