XNA背景音乐更改无法正常工作

时间:2016-05-20 05:32:41

标签: audio xna

在XNA中,我想管理每个游戏状态的背景声音。例如;选项为“开始”时将播放StartMenu音乐,或者在播放选项时播放音乐。我按顺序安排了代码,因为你可以看到我在所有声音类中创建了play和stop方法,但它只在退出游戏时才有效。

public abstract class Sound
{
    public SoundEffect Item { get; set; }
    public Song BgSound { get; set; }
    public abstract void LoadContent(ContentManager content);
    public abstract void Play();
    public abstract void Stop();
}
public class GameSound : Sound
{
    public GameSound()
    {
        BgSound = null;
        Item = null;
    }
    public override void LoadContent(ContentManager content)
    {
        BgSound = content.Load<Song>("Sounds/BgSound");
        MediaPlayer.IsRepeating = true;
    }
    public override void Play()
    {
        MediaPlayer.Play(BgSound);
    }
    public override void Stop()
    {
        MediaPlayer.Stop();
    }
}
public class StartUpSound : Sound
{
    public StartUpSound()
    {
        BgSound = null;
        Item = null;
    }
    public override void LoadContent(ContentManager content)
    {
        BgSound = content.Load<Song>("Sounds/StartUp");
        MediaPlayer.IsRepeating = false;
    }
    public override void Play()
    {
        MediaPlayer.Play(BgSound);
    }
    public override void Stop()
    {
        MediaPlayer.Stop();
    }
}
public class GameBase : Microsoft.Xna.Framework.Game
{
    //..
    GameSound gameSoundFx = new GameSound();
    StartUpSound startUpSoundFx = new StartUpSound();
    //..
    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);
        gameSoundFx.LoadContent(Content);
        startUpSoundFx.LoadContent(Content);
    }
    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
        spriteBatch.Begin();

        if (currentState == GameState.StartMenu)
        {
            startUpSoundFx.Play();
        }
        if (currentState == GameState.Playing)
        {
            startUpSoundFx.Stop();
            gameSoundFx.Play();
        }
        spriteBatch.End();
        base.Draw(gameTime);
    }
}

被修改

我也是这样再次尝试但没有任何改变;

if (currentState == GameState.StartMenu)
{
    startUpSoundFx.BgSound = Content.Load<Song>("Sounds/StartUp");
    MediaPlayer.Play(startUpSoundFx.BgSound);
}
if (currentState == GameState.Playing)
{
    MediaPlayer.Stop();
    gameSoundFx.BgSound = Content.Load<Song>("Sounds/StartUp");
    MediaPlayer.Play(gameSoundFx.BgSound);
}

1 个答案:

答案 0 :(得分:0)

这已经得到了解答 -

https://gamedev.stackexchange.com/questions/86038/c-how-to-properly-play-background-songs-in-xna

请在那里查看答案,这里包含的示例 -

switch (currentGameState)
        {
            case GameState.MainMenu:
                if (musicState == MusicState.Playing && currentGameState != lastGameState)
                {
                    MediaPlayer.Stop();
                    musicState = MusicState.NotPlaying;
                }
                if (musicState == MusicState.NotPlaying)
                {
                    MediaPlayer.Play(song_mainTheme);
                    musicState = MusicState.Playing;
                }
                break;

            case GameState.GamePlaying:
                if (musicState == MusicState.Playing && currentGameState != lastGameState)
                {
                    MediaPlayer.Stop();
                    musicState = MusicState.NotPlaying;
                }
                if (musicState == MusicState.NotPlaying)
                {
                    MediaPlayer.Play(song_actionTheme);
                    musicState = MusicState.Playing;
                }
                break;
         }

它显示了扩展状态以允许正确使用媒体播放器 - 如您的问题评论中所述。