检查特定歌曲是否在xna中播放

时间:2013-01-28 03:06:29

标签: c# xna

我想知道是否可以检查特定歌曲是否在XNA中播放,我想要做的是

if(stateS == "normal")
        {
            if(MediaPlayer.IsPlaying(song1)
            {
               //do nothing  
            }
            if(!MediaPlayer.IsPlaying(song1)
            {
               //play song 1 
            }
            spriteBatch.Draw(norm, pos, Color.White);
        }
        if(stateS == "fast")
        {
            if(MediaPlayer.IsPlaying(song2)
            {
               //do nothing  
            }
            if(!MediaPlayer.IsPlaying(song2)
            {
               //play song 2
            }
            spriteBatch.Draw(fast, pos, Color.White);
        }
        if(stateS == "slow")
        {
            if(MediaPlayer.IsPlaying(song3)
            {
               //do nothing  
            }
            if(!MediaPlayer.IsPlaying(song31)
            {
               //play song 3
            }
            spriteBatch.Draw(slow, pos, Color.White);
        }

可悲的是,我还没有找到任何方法来做到这一点,因为我无法找到是否正在播放特定的歌曲。任何建议或帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

您可以使用时间跨度字典标记每个声音开始播放的时间来跟踪所有声音:

Dictionary<string, TimeSpan> SoundStartTimeDic;

每次声音开始播放时填充字典的键值对,其名称为键,当前游戏时间为值,如下所示:

SoundStartTimeDic[mySound.Name()] = gameTime;

然后你可以看到当前时间减去声音开始时间之间的差异是否大于声音的持续时间:

if (gameTime.TotalMilliseconds -
     SoundStartTimeDic[mySound.Name()].TotalMilliseconds >
     mySound.Duration.TotalMilliseconds)
{ /* yes, the sound has played already */ }

所以我想你想在它结束后再次播放你的声音。你出于某种原因使用MediaPlayer

您可以使用System.Media.SoundPlayer

SoundPlayer sound = new SoundPlayer("path");
sound.PlayLooping();

或者做XNA方式:

SoundEffect bgmusic;
bgmusic = Content.Load<SoundEffect>("path");
SoundEffectInstance instance = bgEffect.CreateInstance();
instance.IsLooped = true;
bgEffect.Play();

答案 1 :(得分:0)

使用另一个名为“播放”的歌曲变量,我将我希望播放的歌曲设置为播放。例如:

        if (stateS == "normal")
        {
            if (!MediaPlayer.Equals(playing, normS))
            {
                playing = normS;
            }

            spriteBatch.Draw(norm, pos, Color.White);
        }
        else if (stateS == "fast")
        {
            if (!MediaPlayer.Equals(playing, fastS))
            {
                playing = fastS;
            }
            spriteBatch.Draw(fast, pos, Color.White);
        }
        else if (stateS == "slow")
        {
            if (!MediaPlayer.Equals(playing, slowS))
            {
                playing = slowS;
            }
        }