クソゲーを作りながらMicrosoftの統合ゲーム開発環境「XNA Game Studio 3.0」を学習するWikiです。



注意


ここに掲載されているのは古い情報となります。MediaPlayer.Playを使ったほうが簡単にBGMを再生できます。

bgm1_intr.mp3ファイルをプロジェクトにドラッグ&ドロップして下記のコードで再生します。

 Song song = content.Load<Song>("bgm1_intr");
 MediaPlayer.Play(song);

内容


XNAでBGMを鳴らすには、

 Discovery and Enumeration
 
  A game can query strongly-typed media collections for songs,
 artists, albums, playlist, genres, pictures, and picture albums
 using the Microsoft.Xna.Framework.Media namespace. See How To:
 Show Pictures for an example. Items in the media library can
 also be searched based on metadata such as artist name,
 album name, or musical genre. 
 
 Songs as Background Music
 
  Access to the media library, combined with the ability to use
 playlists, allows games to create interesting background scores
 that can change with game play. 
 
 Pictures as Textures
 
  Games can obtain and use textures from pictures within a media
 library. 
Microsoft.Xna.Framework.Mediaというのを使えばメディアライブラリーっぽいことができることが書かれているが、今のところそこまでの機能は必要ではなくシンプルなものを使いたいので、効果音を鳴らすと同じ方法でBGMを再生する方法を使うことにした。

改めて、XNAでBGMを鳴らすには、

効果音を鳴らすで作成した.xapに、

1. .xapにWave BankとSound Bankを追加
2. .xapに追加したWave BankにBGMとして鳴らしたい.wavファイルを追加(Insert Wave File(s)...)
3. 追加した.wavファイルをSound BankのCueとして割り当てる
4. Compression Presetを追加
5. 追加したWave BankのTypeをIn Memoryから「Streaming」に変更
6. 追加したWave BankのCompression Presetを<none>から追加したCompression Presetに変更
7. 追加したWave BankのSizeが小さくなる
8. 必要に応じてMicrosoft Reverb Presetなどを割り当てることが可能
9. 追加したSound Bankに割り当てたWave BankのCategoryをDefaultから「Music」に変更、Loopingを「Infinite」に変更
10. .xapを保存

プログラムで、

1. コンテンツとして追加した.xapをAudioEngineとして読み込む
2. AudioEngineからWaveBankをOffsetとBlock生成
3. AudioEngineからSoundBankを生成
4. 生成したSoundBank.PlayCueで再生


http://msdn.microsoft.com/en-us/library/bb203879.a...
http://msdn.microsoft.com/en-us/library/bb195053.a...
上記を参考にします。

1. XACTで効果音として鳴らしたい.wavファイルを追加

  • 2. Wave Banks→New Wave Bankで新しいWave Bankを追加。



2つ目のWave Bankなので「Wave Bank 2」という名前になっている。便宜上このままにする。
  • 3. Sound Banks→New Sound Bankで新しいSound Bankを追加。



同じく2つ目のSound Bankなので「Sound Bank 2」という名前になっている。便宜上このままにする。
  • 4. ウィンドウが重なっているのでWindow→Tile Horizontallyで縦に並べて表示。


  • 5. 左のツリー上のWave Bank 2をクリックしてアクティブにしてから、Wave Banks→Insert Wave File(s)...でBGMとして鳴らしたい.wavファイルを全て選択。

Wave Bankウィンドウに2つの.wavが追加された。(今回は2つ追加した)


  • 6. 追加された2つの.wavを全て選択して、Sound BankウィンドウのCue Nameの方へドラッグ&ドロップ。

このときSound Bankウィンドウが小さいとCue Nameが見えないことがあるので、予めCue Nameが見えるようにしておく。

Sound BankウィンドウのSound NameとCue Nameにそれぞれ2つが追加された。


  • 7. Global Settings→New Compression Presetで新しいCompression Presetを追加。



追加された。


  • 8. 左のツリー上のWave Bank 2をクリックしてアクティブにして、そのツリーの下に表示されるプロパティのTypeの「Streaming」をクリックしてStreamingにし、続いてその下のCompression Presetを<none>から「Compression Preset」に変更する。

BGM用に生成される.xwbファイルのサイズが Size: 2.76MB になると表示される。


  • 9. 右ウィンドウ内のSound Bank 2 (Sound Bank)ウィンドウ内の追加したSound Name、ここでは「bgm1_intr」と「bgm2_intr」をそれぞれクリックして、左のツリーの下に表示されるプロパティのCategoryをDefaultから「Music」に変更し、続いてその下のLoopingのInfiniteをチェックする。(Sound Bankが2つあれば2つに適用する必要がある。)


  • 10. File→Save Projectで保存する。

2. BGMを読み込む

  • 1. Game1.csの29行目辺りにWaveBank、SoundBankを格納するメンバ変数と、Vキーが押されっぱなしかどうかを判定する変数と、現在のBGMの番号を管理する変数と、現在再生中のCueを管理する変数を、それぞれ追加します。



        WaveBank waveBank2;
        SoundBank soundBank2;
        bool pressingV = false;
        int bgmId = -1;
        Cue curCue = null;
  • 2. 69行目辺りにWaveBank、SoundBankを読み込む処理を書きます。




            waveBank2 = new WaveBank(audioEngine, "Content\\Audio\\Wave Bank 2.xwb", 0, 16);
            soundBank2 = new SoundBank(audioEngine, "Content\\Audio\\Sound Bank 2.xsb");
ファイル名が Wave Bank 2.xwb と Sound Bank 2.xsb なことに注意。あとwaveBank2の第3・第4引数の 0 と 16 は、それぞれ再生開始オフセットとパケットサイズ。オフセットは気にせず0、パケットサイズはファイルがDVD上にある場合は16の倍数が良いと書かれているので16にしておく。(DVD上にはないけど。)

3. BGMを鳴らす

  • 1. 118行目辺りのaudioEngine.Update();の上に、Vキーが押されたら次のBGMを再生する処理を書きます。



            if (ks[Keys.V] == KeyState.Down && !pressingV)
            {
                pressingV = true;
                if (curCue != null)
                {
                    curCue.Stop(AudioStopOptions.AsAuthored);
                }
                bgmId = (bgmId + 1) % 2;
                if (bgmId == 0)
                {
                    curCue = soundBank2.GetCue("bgm1_intr");
                }
                else
                {
                    curCue = soundBank2.GetCue("bgm2_intr");
                }
                curCue.Play();
            }
            else if (ks[Keys.V] == KeyState.Up)
            {
                pressingV = false;
            }
Vキーが押されたらbgmIDを1つ進めて、現在再生中のCueがあればcurCue.Stop()で再生を止める。bgmIdが0か1かでそれぞれ「bgm1_intr」か「bgm2_intr」を現在再生中のCueとして入れてcurCur.Play()で再生を開始。

4. F5キーで実行。


Vキーを押すとBGMが鳴った。もう一度Vキーを押すとBGMが変わった。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

メンバーのみ編集できます