第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;
    }
}