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

第17回:効果音を再生する

 ゲームエンジン開発編にて、効果音やBGMを処理するクラスを作成していますので、音楽の再生について特に難しいことはありません。ローディングクラス内にて、再生に関するクラスを作成し、プレイヤークラスや敵クラス内に適時追加するだけです。

Load.cpp
void CLoadStage::LoadThread(void *data)
{
	// ここで時間のかかる処理を実行
	ListData ld;

	ResetItemBox();

	/* 省略 */

	// ミサイル発射効果音
	ld.gameobj = new CSound(_T("data\\missile.wav"));
	ld.autodelete = true;
	strcpy_s(ld.name, 32, "missile");
	ld.priority = 1000;
	temp.push_back(ld);
	AppendItemBox("missile", ld.gameobj);

	// 爆発効果音1
	ld.gameobj = new CSound(_T("data\\explode1.wav"));
	ld.autodelete = true;
	strcpy_s(ld.name, 32, "explode1");
	ld.priority = 1000;
	temp.push_back(ld);
	AppendItemBox("explode1", ld.gameobj);

	// 爆発効果音2
	ld.gameobj = new CSound(_T("data\\explode2.wav"));
	ld.autodelete = true;
	strcpy_s(ld.name, 32, "explode2");
	ld.priority = 1000;
	temp.push_back(ld);
	AppendItemBox("explode2", ld.gameobj);

	// 爆発効果音3
	ld.gameobj = new CSound(_T("data\\explode3.wav"));
	ld.autodelete = true;
	strcpy_s(ld.name, 32, "explode3");
	ld.priority = 1000;
	temp.push_back(ld);
	AppendItemBox("explode3", ld.gameobj);

	complete = true;
}

 以下に効果音の再生サンプルを列挙します。 効果音のサンプルはこちらのリンクよりダウンロードできます。

missile.wav explode1.wav explode2.wav explode3.wav

Player.h
class CPlayer : public CCharactor
{
	/* 省略 */

private:
	CSound missile;
};

Player.cpp
void CPlayer::Init()
{
	missile = *(CSound*)FindItemBox("missile");

	/* 省略 */
}

void CPlayer::Shoot()
{
	missile.Play();

	/* 省略 */
}

void CPlayer::Destroy()
{
	/* 省略 */

	((CSound*)FindItemBox("explode2"))->Play();
}

EnemyBase.cpp
void CEnemyBase::Damaged()
{
	hardness--;
	if(hardness == 0){
		// 自身が削除されても効果音を再生し続けられるように配慮
		CSound *se = new CSound(*(CSound*)FindItemBox("explode1"));
		se->EnableDeleteByEnd();
		se->Play();

		AppendObject(new CExplosion(x, y), EXPLOSION_PRIORITY, true);
		RemoveObject(this);
	}
}

Enemy.cpp
void CEnemy3::Damaged()
{
	hardness--;
	if(hardness == 0){
		/* 省略 */

		CSound *se = new CSound(*(CSound*)FindItemBox("explode2"));
		se->EnableDeleteByEnd();
		se->Play();

		AppendObject(new CPowerupItem(x, y), PLAYER_PRIORITY, true);
		RemoveObject(this);
	}
}

Boss.cpp
void CBoss::MiniExplosion()
{
	/* 省略 */
	
	((CSound*)FindItemBox("explode2"))->Play();
}

bool CBoss::ActionDestroy()
{
	frame++;
	if(frame < 500){
		/* 省略 */

		if(frame % 15 == 0){
			((CSound*)FindItemBox("explode1"))->Play();
		}

		return false;
	}else{
		/* 省略 */

		CSound *se = new CSound(*(CSound*)FindItemBox("explode3"));
		se->EnableDeleteByEnd();
		se->Play();

		return true;
	}
}