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

本文关键字:xna 播放 是否 检查 | 更新日期: 2023-09-27 17:56:28

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

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

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

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

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();

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

        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;
            }
        }