一定時間ごとに敵キャラを発生させるサンプル

この章では、シューティングゲームの雑魚キャラのように、複数の敵が出てくる場合の制御方法についての基本的な考え方を学ぶ。

この章で使用するプログラムおよび画像ファイル

プログラムおよび画像ファイルダウンロードしてプロジェクトを作成し、正常に動くことを確認すること。少し複雑なプログラムであるため、以下に概要を示す。

1.ゲーム概要

このゲームは、縦スクロール方のシューティングである(この時点では作りかけ)。ステージは3面あり、上のステージに行くほど難易度が上がる(予定)。全てのステージをクリアしたらゲームクリアとなり、途中で撃墜されたらゲームオーバーとなる。

2.プログラムの全体構成

このプログラムは、次のような流れで作られている。

3.ゲーム処理について

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

ゲーム開始時に1度だけ行う初期化(GameInit関数)
・自キャラ、敵キャラ用テクスチャの生成
・ステージ番号のセット(1面からスタート)
ステージが変わるたびに行う初期化(GameStargeInit関数)
・背景用テクスチャの生成(ステージ毎に画像が違うため)
・自キャラのステージ開始時表示座標、移動量をセット
・敵キャラのステータス情報(矩形、あたり判定用矩形、ライフ(DEAD))をセット

スタート画面からゲーム画面に切り替わった際は、次のように処理が流れる。

  1. GameInit処理
  2. GameStageInit処理
  3. GameFrame処理

1面をクリアして2面に移る、または2面をクリアして3面に移る場合は、次のように処理が流れる。

  1. GameStageInit処理
  2. GameFrame処理

《POINT》

4.ゲーム中の処理について

ゲーム中の処理は、次の順番で各処理を実行している。

ゲームを作りこんでいくと、それぞれの処理が複雑になることが予想される(背景スクロール、キャラクタのアニメーション、死亡時の処理など)ため、関数化した。

5.敵キャラ移動処理について

現在敵キャラは、画面の上から現れ、真っ直ぐ下に下りるだけである。しかし、敵キャラの種類は増やす予定であるため、真っ直ぐ下に下りるだけの移動処理を行う関数(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から呼び出すことができる。

6.ゲームオーバー、ステージクリア、ゲームクリア処理について

ゲームオーバー、ステージクリア、ゲームクリアになった場合の処理は、マクロは作成済みであるがプログラムは作成していない。ただし、ファンクションキーのF1からF3を押すことによってステージを切り替え、F10でスタート画面に戻るようにしてある。この処理はデバッグ用とし、削除予定である。

※このサンプルプログラムがどのように作られ、どのように動作しているかをしっかり理解してから次へ進むこと。



NEXT(敵キャラの移動パターンを増やす)