-2

我想知道是否可以检查 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);
        }

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

4

2 回答 2

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();
于 2013-01-28T03:13:57.247 回答
0

使用我命名为 Playing 的另一个 Song 变量,我将我希望播放的歌曲设置为它,然后播放它。例子:

        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;
            }
        }
于 2013-01-29T00:25:46.997 回答