如何检查音效是否正在播放(循环播放BG歌曲)

时间:2013-03-02 18:19:01

标签: c# windows-phone-7 xna-4.0 soundeffect

这是我正在滚动的设置。鉴于此,如何判断_BGMusic SoundEfect何时结束?我正在运行一个循环几秒钟的游戏循环,我最终想要循环播放这首歌。

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;

    SoundEffect _BGMUSIC;

    public Page1() {
     ...

     LoadSound("sfx/piano.wav", out _BGMUSIC);
     ...
    }

    private void LoadSound(String SoundFilePath, out SoundEffect Sound) {
        // For error checking, assume we'll fail to load the file.
        Sound = null;
        try {
            // Holds informations about a file stream.
            StreamResourceInfo SoundFileInfo =
                    App.GetResourceStream(new Uri(SoundFilePath, UriKind.Relative));
            // Create the SoundEffect from the Stream
            Sound = SoundEffect.FromStream(SoundFileInfo.Stream);
            FrameworkDispatcher.Update();
        } catch (NullReferenceException) {
            // Display an error message
            MessageBox.Show("Couldn't load sound " + SoundFilePath);
        }
    }

2 个答案:

答案 0 :(得分:0)

从此代码看,您刚刚将声音存储在Sound中,但未显示实施Sound.Play()方法的位置。虽然没有Sound.IsPlaying布尔值可能会解决您的问题,但您可以使用Sound.Duration属性来解决问题,尤其是如果您将其与Timer结合使用(它可以串联使用来设置一个标志,以显示声音是否正在播放。

我从未使用的是just found Sound.IsDisposed属性。我肯定会研究这个问题,因为它可能正是你正在寻找的东西。

答案 1 :(得分:0)

好的,所以这个问题的答案实际上非常简单,并在微软的MSDN页面中很好地概述(一次)。

要使用上面的内容实现它,您需要执行以下操作。

创建全局SoundEffectInstance

 SoundEffectInstance _BGMUSICINSTANCE;

在我的示例中,我在main方法中初始化SoundEffect,因此在其下面我想初始化SoundEffectInstance。

_BGMUSICINSTANCE = _BGMUSIC.CreateInstance();

现在实例已加载并准备就绪,我们可以将其loop属性设置为true。您也可以在main方法中或任何您想要的位置执行此操作。这是全球性的

 _BGMUSICINSTANCE.IsLooped = true;

最后播放歌曲

 _BGMUSICINSTANCE.Play();

参考页面 http://msdn.microsoft.com/en-us/library/dd940203(v=xnagamestudio.31).aspx