第17回:効果音を再生する
ゲームエンジン開発編にて、効果音やBGMを処理するクラスを作成していますので、音楽の再生について特に難しいことはありません。ローディングクラス内にて、再生に関するクラスを作成し、プレイヤークラスや敵クラス内に適時追加するだけです。
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
class CPlayer : public CCharactor
{
/* 省略 */
private:
CSound missile;
};
void CPlayer::Init()
{
missile = *(CSound*)FindItemBox("missile");
/* 省略 */
}
void CPlayer::Shoot()
{
missile.Play();
/* 省略 */
}
void CPlayer::Destroy()
{
/* 省略 */
((CSound*)FindItemBox("explode2"))->Play();
}
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);
}
}
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);
}
}
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;
}
}