2012年1月29日日曜日

BGM再生

Silverlight に  XNA Framework が利用できるようになったので
BGM再生を実装していたのですが、SoundEffect クラスでは、MP3のファイルが再生できませんでした。
まあ、SoundEffect クラスは、効果音などのファイルサイズの小さいサウンドを再生するためのクラスのようなので、それもそうかという仕様でした。
ということで、MediaElement クラスでBGM再生を実装しました。ただ、MediaElementクラスは、再生開始までに少し時間がかかってしまいますが、それは、まあ、しかたないということで。
(ちなみに、 BGMをmp3からwavに変換すれば、SoundEffect クラスで再生可能ですが
そうなると今度はファイルサイズが大きくなりすぎてしまうという問題が起きます)

ということで、MediaElementクラスを用いてBGM再生を実装しました。
参考にしたのは下記サイトです。
http://bygzam.seesaa.net/article/110314848.html
http://bygzam.seesaa.net/article/110314849.html


下記のような実装にしました。
StringEnumAttributeクラスとは、enumの属性を取得するクラスで、ここではenum値の属性からuriStringを取得すメソッドを実行しています

/// <summary>
/// ゲーム全体のBGMを管理するMediaElement
/// </summary>
private static MediaElement MusicElement;

/// <summary>
/// 指定したBGMを鳴らす
/// </summary>
/// <param name="kind"></param>
public static void Play(SoundBGMKind kind)
{
 // ファイルの取得
 string uriString = StringEnumAttribute.GetStringValue(kind);
 StreamResourceInfo streamInfo = Application.GetResourceStream(new Uri(uriString, UriKind.Relative));

 // 再生
 MusicElement.SetSource(streamInfo.Stream);
 MusicElement.Play();
}