Мне удалось воспроизвести аналогичную проблему (для меня окно Игры будет зависать и перестать отвечать на запросы) в новом игровом проекте с использованием кода, который вы разместили выше.
Мне также удалось найти сообщения на форумеот других, сталкивающихся с подобными проблемами (еще два года назад, как этот -> http://forums.create.msdn.com/forums/t/45296.aspx).Это явно ошибка в фреймворке.
Я не совсем уверен, что может происходить.Я предполагаю, что с проверкой 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.