サウンドについて

こちらでは音の再生に関する代表的な関数について説明する。まずは以下のソースコードを見ていただきたい。

#include <DxLib.h>
#define PI 3.1415926535897932384626433832795f

//キー取得
int keystate[256];

int keyupdate()
{
    char key[256];
    GetHitKeyStateAll(key);
    for(int i = 0; i< 256; i++)
    {
        if(key[i] != 0)
        {
            keystate[i]++;
        }
       else
       {
           keystate[i] = 0;
        }
    }

    return 0;
}

int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow )
{
    ChangeWindowMode( TRUE );//非全画面にセット
    SetGraphMode( 800 , 600 , 32 );//画面サイズ指定
    SetOutApplicationLogValidFlag( FALSE ) ;//Log.txtを生成しないように設定
    if(DxLib_Init() == 1){return -1;}//初期化に失敗時にエラーを吐かせて終了

    //
    //ここで敵やプレイヤーのオブジェクトの実体を作る
    //
    int bgm, se;
    bgm = LoadSoundMem("bgm.ogg");
    se = LoadSoundMem("sound.wav");

    int count = 0, play = 0;

    //BGM再生
    PlaySoundMem(bgm, DX_PLAYTYPE_LOOP);

    while( ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
    {
        keyupdate();

        ClearDrawScreen();//裏画面消す
        SetDrawScreen( DX_SCREEN_BACK ) ;//描画先を裏画面に

        count++;

        //ZキーでSEを再生
        if(keystate[KEY_INPUT_Z] == 1)
        {
            PlaySoundMem(se, DX_PLAYTYPE_BACK);
        }
        if(keystate[KEY_INPUT_X] == 1)
        {
            if(play % 2 == 0)
            {
                StopSoundMem(bgm);
                play++;
    }
            else
            {
                PlaySoundMem(bgm, DX_PLAYTYPE_LOOP);
                play++;
            }
        }

        ScreenFlip();//裏画面を表画面にコピー
    }

    DxLib_End();
    return 0;
}

LoadSoundMem(Char* FileName)

音声ファイルを読み込む。対応している形式はwav、ogg、mp3。
読み込みの方法はLoadGraphと同じ。

PlaySoundMem(int SoundHandle, int PlayType, int TopPositionFlag);

SoundHandleにはLoadSoundMemで読み込んだ再生したい音の変数名を入れる。
PlayTypeでは音の再生形式を指定する。以下の3種類のいずれかを入れる。
 DX_PLAYTYPE_NORMAL......ノーマル再生
 DX_PLAYTYPE_BACK......バックグラウンド再生
 DX_PLAYTYPE_LOOP......ループ再生
NORMALは音の再生中に他の処理が止まってしまうので非推奨。
基本的には一度だけ鳴らしたい(SE)ならBACK、繰り返し鳴らしたい(BGM)ならLOOPという使い方になるだろう。
TopPositionFlagをFALSEにすると、StopSoundMem(後述)で再生を止めた後に改めて再生した場合、停止した部分から再生される。
TopPositionFlagは省略可能で、その場合TRUE(改めて再生した場合も初めから再生)を指定したものとして扱われる。

いずれの再生形式にしても、毎フレーム呼び出される処理に入れてしまうと何重にもなって再生されてしまう。呼び出しさえ行えば、以降は再生終了またはこちらが再生停止するまで流れ続けるので、基本的には1フレームだけ呼び出される処理の中で呼び出す。

StopSoundMem(int SoundHandle);

SoundHandleにはLoadSoundMemで読み込んだ再生を停止したい音の変数名を入れる。
基本的には現在鳴っている音を止めたい時(タイトル→本編への場面転換など)に、その音の変数名を入れて使うことになるだろう。