在XNA中,我使用MediaPlayer播放我的音乐。我发现在运行发布版本时(作为可执行文件运行,而不是从Visual Studio运行),游戏窗口有时会闪烁,看起来像是在尝试最小化,然后又回来了。有时任务栏上的游戏图标会出现在边上,然后滑回原来的位置。我使用的是Windows7,只需启动游戏,将资源管理器窗口设置为活动窗口,停留一两秒钟,然后点击游戏,就可以很容易地进行重现。游戏窗口大约需要6-10秒的时间,但在那之后大约每4-8秒就会发生一次。
我找出了到底是什么导致了这一点,它是下面的代码,通过主游戏更新调用。
if (!IsActive && MediaPlayer.State != MediaState.Paused)
{
MediaPlayer.Pause();
}
if (IsActive && MediaPlayer.State == MediaState.Paused)
{
MediaPlayer.Resume();
}
基本上,我是在游戏未激活时暂停音乐,在游戏再次激活时取消暂停。出于某种原因,这把事情搞得一团糟。我试着把音乐调成静音,而不是暂停,但我得到了同样的效果。我做了一个新的PCXNA4.0游戏,但即使在主更新函数中只有上面的代码(和base.Update),它仍然会发生,所以它肯定是导致问题的代码。有没有人知道这里发生了什么,或者当游戏不活动时暂停音乐的另一种方式?
发布于 2012-03-24 05:14:08
我能够使用你上面发布的代码在一个新的游戏项目中重现类似的问题(对我来说,游戏窗口实际上会挂起并变得没有反应)。
我还能够找到其他遇到类似问题的人的论坛帖子(早在两年前,就像这个-> http://forums.create.msdn.com/forums/t/45296.aspx一样)。这显然是框架中的一个bug。
我不太确定可能发生了什么。我猜想在检查MediaPlayer的时候可能会发生一些有趣的事情,它可能偷走了窗口焦点,然后返回到游戏,返回焦点,所以在几毫秒内,游戏失去了焦点,获得了焦点,所以音乐以每秒60次的速度暂停、恢复、反复暂停。在像我这样较弱的机器上,它会导致窗口变得无响应。这一切都只是猜测,因为我不能确定,但这是有意义的。
不过,我可以通过简单地将MediaPlayer状态检查从等式中删除来解决这个问题。如果您有自己的布尔标志,并将其添加到游戏中(类似于“isPlaying”),然后查询该布尔变量,而不是检查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的内置状态时出现的不需要的行为。
发布于 2013-04-28 12:12:48
为什么不在您真正想要暂停音乐的事件中暂停音乐,并在取消暂停游戏的事件中恢复播放?然后,您不再需要bool变量,而是每次都要检查它。我在我的PauseScreen类逻辑上做到了这一点。
https://stackoverflow.com/questions/9845657
复制相似问题