【问题标题】:Song doesn't play all the time in Monogame在 Monogame 中,歌曲不会一直播放
【发布时间】:2013-10-16 19:20:41
【问题描述】:

嘿,

我们用 Monogame 创建了一个游戏,但遇到了以下问题。

我们现在有一个主题曲在您加载游戏时播放的问题是主题曲有时播放但有时不播放。我们通过 XNA 管道将其转换为 wma 并将其与 .xnb 一起加载到我们的游戏中,但有时音乐不想开始。

我们只是使用标准代码来开始一首歌曲,所有这些代码都会触发。

internal void PlayBackgroundMusic()
{
    if (MediaPlayer.GameHasControl)
    {
        MediaPlayer.Volume = mainVolume;
        MediaPlayer.Play(backgroundMusic);
        MediaPlayer.IsRepeating = true;
    }
}

我们也使用 SoundEffects,但这些效果 100% 有效,只是在您每次开始时不会播放的歌曲。顺便说一句,Windows RT 运行良好。

【问题讨论】:

  • 3年过去了,MediaPlayer仍然没有播放歌曲(我的经验在iOS中,在WinRT中有效),您解决了问题吗?

标签: c# xna windows-store-apps monogame


【解决方案1】:

确保调试器通过调试进入 if 语句(或暂时删除该语句)。另一种可能是该函数在游戏完全初始化之前正在运行。您可以尝试延迟该功能,直到游戏完全加载。

PS:我还不能对问题发表评论,所以这里有一个答案。

编辑

好吧,在搞砸了 Song 类并查看 MonoGame 中的实现之后,我得出的结论是 SoundEffect 类更易于使用且实现更好。

backgroundSound = Content.Load<SoundEffect>("alarm");

protected override void BeginRun()
{
    // I created an instance here but you should keep track of this variable
    // in order to stop it when you want.
    var backSong = backgroundSound.CreateInstance();
    backSong.IsLooped = true;
    backSong.Play();

    base.BeginRun();
}

我使用这个帖子:using BeginRun override 在启动时播放 SoundEffect。

【讨论】:

  • 就像我提到的,我的代码在 backgroundMusic 已经加载的情况下被触发了。我什至尝试以 2 秒的延迟播放主题,但这也无济于事。我从其他人那里发现了一些关于歌曲没有播放的模糊问题,但使用的是旧版本的 monogame,他们说它已在 3.0 中修复,我什至正在运行 3.2
  • 我得到了同样的信息。歌曲似乎有效,但循环播放歌曲无效。我建议使用 SoundEffect,因为它的实现更好,并且支持开箱即用的循环播放。
  • 我不喜欢使用 SoundEffect,因为它被认为对于大文件来说效率非常低github.com/mono/MonoGame/issues/948 虽然我的应用程序已经发布并且我联系的每个人都没有自己开发它们声音播放问题。这真的很奇怪,我不知道我是否可以相信它,但现在可以。如果有明显差异,我肯定会研究您的解决方案并检查内存和 CPU 使用情况。感谢您到目前为止的帮助。
【解决方案2】:

如果您想播放歌曲,请使用 Song 类。但在将它们转换为“.xnb”之前,请确保您使用的是“.mp3”而不是“.wma”。

backgroundMusic = Content.Load<Song>("MainTheme");
MediaPlayer.Play(backgroundMusic);
MediaPlayer.IsRepeating = true;

MSDN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多