「音楽」と「効果音」を鳴らす

DirectX を使って「音楽」と「効果音」を鳴らします。
DirectX と言えども miyama.lib を使えば、簡単にプログラムできます。
三山くずしゲームの作成は 三山くずし Game Program を参照して下さい。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの作成

  1. プロジェクト(Miyama) のフォルダーに miyama.lib と miyama.h を格納して下さい。
    [プロジェクト][既存項目の追加] から miyama.h をプロジェクトに追加します。
    [プロジェクト][プロパティ][リンカ][入力] で miyama.lib と dxguid.lib を追加して下さい。
  2. Miyama.cpp の先頭に次のコードを追加して下さい。
    AUDIO が「音楽」と「効果音」の Class です。
        #include   "Miyama.h"
        #define     ID_TIMER (WM_APP + 0)
    
        Audio       AUDIO;
        Miyama     *App= NULL;          // Miyama Object Class
        LPSTR       BmpFile= { "jewel.bmp" };
        POINT       pt;                 // CLICK の位置を記録
        short       NUM;                // T[] の次の記録位置
        char        Rule[]=
        { "三個の山に石が積まれています。\n"
          "この石を私とあなたが交互に取り除きます。\n"
          "一度に一つの山からであれば、幾つでも取り除くことができます。\n"
          "最後の石を取らされた方が負けです。"
        };
        
  3. InitInstance() に Dialog Box を表示するコードを追加します。
            App->hDlg = CreateDialog(hInst,MAKEINTRESOURCE(IDD_DIALOG1),
                                     App->hParent,(DLGPROC)MyDlgProc);
            if (App->hDlg == NULL)   return FALSE;
    
            ShowWindow(App->hDlg,SW_SHOW);       //Dialog を表示
            ShowWindow( hWnd, nCmdShow );
            UpdateWindow( hWnd );
            return TRUE;
        }
        
  4. WM_CREATE: でバックミュージックとゲーム開始の音声を鳴らします。
    AUDIO.Load2("037_klar.mid") で MIDI ファイルを設定して AUDIO.Play2(200) で演奏を開始します。
    200 は MIDI を繰り返し演奏する回数です。適当に設定して下さい。
    AUDIO.Load("Start.wav") でゲーム開始の音声を設定して AUDIO.Play() で鳴らします。
    AUDIO.SetVol(&nVolume) で MIDI と効果音の音量のバランスを取っています。
        char    buf[16];
        long    nVolume= 2000;	    //+20db
    
        switch( message ) 
        {
        	case WM_CREATE:
                AUDIO.Load2("037_klar.mid");
                AUDIO.Play2(200);
                App= new Miyama(hWnd,BmpFile);
                App->Start();
                NUM= 1;
                AUDIO.Load("Start.wav");
                AUDIO.SetVol(&nVolume);
                AUDIO.Play();
                break;
        
  5. WM_LBUTTONDOWN: でマウスがクリックされた座標を調べて石を取り除きます。
    (App->down!=0 || (NUM&1)==0) はアニメーションの終了確認と手番の判定です。
    AUDIO.Load("Latch.wav") と AUDIO.Play() で人間側が石を取り除く効果音をならします。
    コンピュータが勝ったとき「私の勝ちです」の音声を鳴らします。
            case WM_LBUTTONDOWN:
                if (App->down!=0 || (NUM&1)==0)  break;
                pt.x= LOWORD(lParam);
                pt.y= HIWORD(lParam);
                if (App->ManPlay(&pt)==0)
                {   MessageBox(hWnd,"エラーです","確認", MB_OK);
                    return TRUE;
                }
                AUDIO.Load("Latch.wav");
                AUDIO.Play();
                App->Log(NUM);
                if (App->Stone()==0)
                {   AUDIO.Load("Win.wav");
                    AUDIO.Play();
                    if (MessageBox(hWnd,"私の勝ちです(次 | 待った)","勝ち", MB_OKCANCEL | MB_ICONQUESTION)==IDOK)
                    {   App->Win_c++;
                        App->Start();
                        NUM= 1;
                        return TRUE;
                    }
                    else
                    {   App->Saigen(NUM);
                        return TRUE;
                    }
                }
                // コンピュータがプレイする
                App->Play();
                if (App->down<=0)  return TRUE;
                SetTimer(hWnd,ID_TIMER,500,NULL);
                return TRUE;
        
  6. WM_TIMER: で石を取り除くアニメーションを行います。
    石を一個取り除く度に効果音を鳴らします。
    コンピュータが負けたときは「あなたの勝ちです」の音声を鳴らします。
            case WM_TIMER:
                AUDIO.Load("Poku.wav");     //石を取り除く音
                AUDIO.Play();
                if (App->CntDown())
                {   KillTimer(hWnd,ID_TIMER);
                    NUM= App->Log();
                    //スクロールバーの設定
                    SetScrollRange(GetDlgItem(App->hDlg,IDC_SCROLLBAR1),SB_CTL,0,NUM-1,TRUE);
                    SetScrollPos(GetDlgItem(App->hDlg,IDC_SCROLLBAR1),SB_CTL,NUM-1,TRUE);
                    if (App->Stone()==0)
                    {   AUDIO.Load("Lose.wav");
                        AUDIO.Play();
                        MessageBox(hWnd,"私の負けです","負け", MB_OK);
                        App->Lose_c++;
                        App->Start();
                        NUM= 1;
                    }
                }
                return TRUE;
        
  7. WM_PAINT: に対戦成績と山の石を描画するコードを記述します。
        char    buf[16];
    
        case WM_PAINT:
            hdc = BeginPaint (hWnd, &ps);
            // TODO: この位置に描画用のコードを追加してください...
            wsprintf(buf,"%d",App->Win_c);
            SetDlgItemText(App->hDlg,IDC_WIN,buf);
            wsprintf(buf,"%d",App->Lose_c);
            SetDlgItemText(App->hDlg,IDC_LOSE,buf);
            App->Disp(hdc);
            EndPaint( hWnd, &ps );
            break;
        
  8. MyDlgProc() は前回と同じです。
    プロジェクトの設定は 勝敗判定とゲームの繰り返し を参照して下さい。
    Dialog Box の設定は Dialog Box を表示する を参照して下さい。
    バックミュージックと効果音が入ると一段とゲームが盛り上がります。

[Next Chapter ↓] デモプレイを設定する
[Previous Chapter ↑] 「棋譜」と「待った」をサポートする

超初心者の方のために全ソースコードを掲載します。 (^_^;)
Audio Class の全ソースコード

超初心者のプログラム入門(Win32API C++)