クラスまみれのゲームプログラミング入門

第18回:ステージ構成をプログラムする

 敵の出現パターンを定義するクラスを作成します。今回はプログラムレベルで定義していますが、マップチップデータに敵出現データを埋め込んだり、スクリプトファイルを別途用意したりするなど、いろいろ工夫するのもよいでしょう。

Enemy.h
class CEnemyPattern : public CGameObject
{
public:
	CEnemyPattern();
private:
	int frame;
protected:
	virtual void Exec();
};

Enemy.cpp
CEnemyPattern::CEnemyPattern()
{
	frame = 0;
}

void CEnemyPattern::Exec()
{
	// フレーム数に応じて敵の出現方法を変える
	if(frame == 0){
		// メインBGMの再生
		CBGMusic *bgm = (CBGMusic*)FindObject("bgm1");
		bgm->Play(true);
	}else if(frame > 150 && frame < 400){
		// 雑魚1の編隊を左側から突入させる
		if(frame % 20 == 0){
			AppendObject(new CEnemy1(40.0f), ENEMY_PRIORITY, true);
		}
	}else if(frame >= 600 && frame < 850){
		// 雑魚2の編隊を右側から突入させる
		if(frame % 20 == 0){
			AppendObject(new CEnemy1(600.0f), ENEMY_PRIORITY, true);
		}
	}else if(frame >= 1050 && frame < 1300){
		// 雑魚1の編隊を左右から交互に突入させる
		if(frame % 40 == 0){
			AppendObject(new CEnemy1(40.0f), ENEMY_PRIORITY, true);
		}else if(frame % 40 == 20){
			AppendObject(new CEnemy1(600.0f), ENEMY_PRIORITY, true);
		}
	}else if(frame == 1500){
		// 中ボスの出現
		AppendObject(new CEnemy3(100.0f), ENEMY_PRIORITY, true);
	}else if(frame > 2000 && frame <= 2400){
		// 雑魚2をランダムの位置に発生
		if(frame % 30 == 0){
			AppendObject(new CEnemy2
				((float)(50 + (rand() % 540))), ENEMY_PRIORITY, true);
		}

		// ボス戦に入る前にメインBGMをフェードアウトさせる
		if(frame == 2400){
			CBGMusic *bgm = (CBGMusic*)FindObject("bgm1");
			bgm->Fade(5000, -5000);
		}
	}else if(frame == 2600){
		// ボスの出現
		CBGMusic *bgm = (CBGMusic*)FindObject("bgm2");
		bgm->Play(true);
		AppendObject(new CBoss(), ENEMY_PRIORITY, true);
	}

	frame++;
}

 BGMの再生に用いられるDirectShowはストリーミング再生に対応しているものの、基本的なデータを読み込んで再生の準備ができるまでには若干の時間がかかるため、BGMクラスの作成もCStageLoadクラス内で行うとよいでしょう。

 MP3といえども、そのファイルサイズは結構な量になるため、サイトからの配布は行っておりませんので、お好みのMP3ファイルを各自ご用意ください。また、インターネットで配布されているmidiファイルを、専用のMIDI機材無しで高音質なMP3ファイルに変換する方法をTNKソフトウェアのブログサイトで紹介していますので、こちらも参考にしてください。