この章では、シューティングゲームの雑魚キャラのように、複数の敵が出てくる場合の制御方法についての基本的な考え方を学ぶ。
プログラムおよび画像ファイルダウンロードしてプロジェクトを作成し、正常に動くことを確認すること。少し複雑なプログラムであるため、以下に概要を示す。
このゲームは、縦スクロール方のシューティングである(この時点では作りかけ)。ステージは3面あり、上のステージに行くほど難易度が上がる(予定)。全てのステージをクリアしたらゲームクリアとなり、途中で撃墜されたらゲームオーバーとなる。
このプログラムは、次のような流れで作られている。

ゲーム開始時に1度だけ初期化をする変数と、ステージが切り替わるたびに初期化する変数があるため、初期化処理関数を「GameInit()」「GameStargeInit()」の2つに分割した。

スタート画面からゲーム画面に切り替わった際は、次のように処理が流れる。
1面をクリアして2面に移る、または2面をクリアして3面に移る場合は、次のように処理が流れる。
ゲーム中の処理は、次の順番で各処理を実行している。

ゲームを作りこんでいくと、それぞれの処理が複雑になることが予想される(背景スクロール、キャラクタのアニメーション、死亡時の処理など)ため、関数化した。
現在敵キャラは、画面の上から現れ、真っ直ぐ下に下りるだけである。しかし、敵キャラの種類は増やす予定であるため、真っ直ぐ下に下りるだけの移動処理を行う関数(EnemyMove0)を作成し、その関数を呼び出すようにしている。
//-----------------------------------------------------------------------------
// 関数名 : EnemyMove()
// 機能概要: 敵キャラ移動
//-----------------------------------------------------------------------------
static void EnemyMove(void)
{
int i;
for (i=0 ; i<ENEMYMAX ; i++) {
if (Enemy[i].flg != DEAD) {
EnemyMove0(&Enemy[i]);
}
}
}
敵キャラの動き(移動処理)は、複数のパターンを作成する予定である。種類が増えるたびに移動処理用の関数が増えることを考え、敵キャラの移動に関する処理をEnemy.cppにまとめた。これらの関数は引数に敵キャラ構造体のアドレスを指定することにより、敵キャラ用配列をexternで宣言することなく、Game.cppから呼び出すことができる。
ゲームオーバー、ステージクリア、ゲームクリアになった場合の処理は、マクロは作成済みであるがプログラムは作成していない。ただし、ファンクションキーのF1からF3を押すことによってステージを切り替え、F10でスタート画面に戻るようにしてある。この処理はデバッグ用とし、削除予定である。
※このサンプルプログラムがどのように作られ、どのように動作しているかをしっかり理解してから次へ進むこと。
| NEXT(敵キャラの移動パターンを増やす) |