从一个实例重复声音

时间:2012-01-24 21:17:12

标签: c# audio xna effects repeat

我一直在阅读有关将声音编程到c#XNA游戏中的不同方法。我决定使用声音实例进行音量控制,但是在播放.wav时,我意识到声音只会在完成后再次播放,而只是使用声音效果.Play()(而不是如果被要求,它将使它自己播放多个副本。所以我的问题是,在按住按钮会导致单个声音效果一次多次播放的情况下(例如机枪的重复无人机等),而不是等到声音文件结束循环;你会如何使用实例?我假设有一些我缺少的东西,或者一个实例不是为此用途而设计的。如果是这样,声音效果的基本选项与声音效果实例的基本选项之间的主要区别是什么?提前谢谢。

1 个答案:

答案 0 :(得分:4)

SoundEffectInstance是一个声音播放的单个实例;根据定义,它不能一次播放多个。当然,您可以拥有相同SoundEffect的多个实例。实际上,这基本上就是当您调用SoundEffect.Play()时发生的事情:您正在创建一个实例并进行播放。

考虑到这一点,您的盘子上有几种选择。如果你[推测]想要在按住按钮时防止十亿声音完全播放,你肯定不应该使用SoundEffect.Play(),就像你发现的那样,会创建很多实例(这可能是对于性能和整体管理来说非常糟糕)。对于频率较低的声音,这可能是一种不错的方法。

话虽如此,SoundEffectInstance以何种方式使用?基本上它可以从一开始就重新启动。请注意,您当然可以拥有多个SoundEffectInstance,每个游戏组件一个(或更多)。通过这种方式,你的一把枪可以重新启动,而不会弄乱不同枪的相同声音的实例。或者,出于性能原因,您可以选择每个声音效果只有一个实例。

我尝试以“简单”方式重启它时遇到了问题:

instance.Stop();
instance.Play();

从历史上看,这对我没有用;如果它适合你,请忽略以下内容:

我必须做的是为每个实例设置自己的“重启”标志。所以我用自己的方式包装了SoundEffectInstance类:

//class that represents one sound effect instance PLUS restart flag
public class Sound
{
    SoundEffectInstance instance;
    bool restart;

    public Sound(SoundEffectInstance i)
    {
        instance = i;
        restart = false;
    }

    public bool PlayingOrRestarting()
    {
        return State == SoundState.Playing || restart;
    }

    public void Update()
    {
        if (restart)
        {
            instance.Play();
            restart = false;
        }
    }

    public void Play()
    {
        instance.Play();
    }

    public void Restart()
    {
        instance.Stop();
        restart = true;
    }

    public void Stop()
    {
        instance.Stop();
        restart = false;
    }

    public SoundState State
    {
        get { return instance.State; }
    }

    public float Volume
    {
        set { instance.Volume = value; }
        get { return instance.Volume; }
    }

    public bool IsLooped
    {
        set { instance.IsLooped = value; }
        get { return instance.IsLooped; }
    }
}

使用此方法,您必须为每个Sound的每一帧调用Update(),因此请将它们集合在某处或以其他方式访问它们。