0

这是我目前正在滚动的设置。鉴于此,我如何判断 _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);
        }
    }
4

2 回答 2

0

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

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

创建一个全局 SoundEffectInstance

 SoundEffectInstance _BGMUSICINSTANCE;

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

_BGMUSICINSTANCE = _BGMUSIC.CreateInstance();

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

 _BGMUSICINSTANCE.IsLooped = true;

终于播放歌曲了

 _BGMUSICINSTANCE.Play();

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

于 2013-03-09T20:29:38.490 回答
0

从这段代码看来,您刚刚将声音存储在其中,Sound但没有显示您实现该Sound.Play()方法的位置。虽然没有Sound.IsPlaying可能解决您的问题的布尔值,但Sound.Duration您可以使用一个属性来解决您的问题,特别是如果您将其与 a Timer( 可以串联使用以触发标志以显示是否或不是声音在播放。

我从未使用过但刚刚找到的东西是该Sound.IsDisposed物业。我肯定也会对此进行调查,因为它可能正是您正在寻找的。

于 2013-03-02T18:29:55.810 回答