いちばんやさしいゲームの作り方

文系の人でも、数理学がわからない人でもゲームプログラミングをマスターできるブログ

関数を指し示す変数を作るためには、関数型のポインタを作ります。

関数を指し示す変数を使うと何が便利かというと、たとえばシューティングゲームの敵キャラクターを作る際、 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

OMEGA
2008/10/03 21:39:07

知りませんでした!!ww
できたら便利だなって思ってたんですけど…

どう調べて良いのかわからなくて…

ためになりました。
早速プログラムに組み込んでみます!!
ありがとうございます

yomogi
2008/10/06 10:28:02

自分の読んだタスクシステムの本はこれを使ってました
標準でしょうか?

Byerkut
2008/10/07 18:38:05

> OMEGA さん
> yomogi さん

自分は関数へのポインタは上級技だと思うのですが、
わりと書籍などでは例に挙がるため結構使われていると思います。
でも、用途がわかるとそれほど難しくないですよね。

Contributions




Trackback URL

メルマガ登録・解除
 
挫折不可能!初級ゲームプログラミング完全マニュアル
RSS track feedいちばんやさしいゲームの作り方 カウンター
ブログSEO対策:track word あわせて読みたい SEO STATUS