xna - 使用 MediaPlayer 时,我在 XNA 中看到奇怪的行为

标签 xna media-player

在 XNA 中,我使用 MediaPlayer 来播放我的音乐。我发现在玩发布版本(作为可执行文件运行,而不是从 Visual Studio 运行)时,游戏窗口有时会闪烁,看起来像是在尝试最小化然后返回。有时任务栏上的游戏图标会偏向一边,然后滑回原来的位置。我正在使用 Windows 7。 通过启动游戏,将资源管理器窗口设置为事件窗口,将其保留一两秒钟,然后单击游戏,很容易重现。游戏窗口跳动大约需要 6-10 秒,之后大约每 4-8 秒跳动一次。

我查明了到底是什么导致了这个,它是以下代码,通过主游戏更新被调用。

if (!IsActive && MediaPlayer.State != MediaState.Paused)
{
    MediaPlayer.Pause();
}
if (IsActive && MediaPlayer.State == MediaState.Paused)
{
    MediaPlayer.Resume();
}

基本上,我会在游戏未启动时暂停音乐,并在游戏再次启动时取消暂停。出于某种原因,这把事情搞砸了。我试过只是让音乐静音而不是暂停,但我得到了同样的效果。我制作了一个新的 PC XNA 4.0 游戏,但即使在主要更新函数中只有上述代码(和 base.Update),它仍然会发生,所以它肯定是导致问题的代码。有谁知道这里发生了什么,或者游戏进入非事件状态时暂停音乐的其他方法?

最佳答案

我能够使用您在上面发布的代码在新的游戏项目中重现类似的问题(对我来说,游戏窗口实际上会挂起并变得无响应)。

我还能够从其他遇到类似问题的人那里找到论坛帖子(早在两年前,就像这个 -> http://forums.create.msdn.com/forums/t/45296.aspx )。这显然是框架中的错误。

我不确定会发生什么。我猜想检查 MediaPlayer 可能会偷走窗口焦点,然后返回到返回焦点的游戏会发生一些有趣的事情,因此在几毫秒内,游戏正在失去并获得焦点,因此音乐正在暂停恢复暂停以每秒 60 次的速度重复。在像我这样较弱的机器上,它会导致窗口变得无响应。这只是推测,因为我不确定,但这是有道理的。

不过,我能够通过简单地从等式中删除 MediaPlayer 状态检查来解决这个问题。如果您将自己的 bool 标志添加到游戏中(类似于“正在播放”),然后查询该 bool 变量而不是检查 MediaPlayer 状态,问题就会解决,您将获得所需的功能。

代码如下所示。

bool isMusicPlaying = false;
protected override void LoadContent()
{
    // Create a new SpriteBatch, which can be used to draw textures.
    spriteBatch = new SpriteBatch(GraphicsDevice);

    Song song = Content.Load<Song>("SampleSong");
    MediaPlayer.Play(song);
    isMusicPlaying = true;
}

protected override void Update(GameTime gameTime)
{
    // Allows the game to exit
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
        this.Exit();

    if (!IsActive && isMusicPlaying == true)
    {
        MediaPlayer.Pause();
        isMusicPlaying = false;
    }
    else if (IsActive && isMusicPlaying == false)
    {
        MediaPlayer.Resume();
        isMusicPlaying = true;
    }

    base.Update(gameTime);
}

使用上面的代码,您应该仍然可以获得您正在寻找的原始功能,同时摆脱使用 MediaPlayer 的内置状态时发生的不良行为。

关于xna - 使用 MediaPlayer 时,我在 XNA 中看到奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9845657/

相关文章:

android - MediaPlayer 直播 m3u8 音频错误 (1,-1010)

android - 当我从垂直 View 更改为水平 View 时,为什么我的歌曲会重新开始播放?

安卓音频搜索栏

Android MediaPlayer 给出空异常

c# - 如何检查鼠标左键是否双击?

c# - 如何从文件路径而不是内容加载 XNA 模型(例如 Model.FromStream 但它不存在)

c# - 如何开始,在哪里学习(Farseer)

Android MediaPlayer 问题 :"Error (-38 , 0) "和 "stop called in state 1"

图形问题 : How do I restrict the mouse cursor to within a circle?

xna - 用于网络世界模拟/AI沙箱的3D游戏引擎