C# 从一个实例重复声音

C# 从一个实例重复声音,c#,audio,xna,effects,repeat,C#,Audio,Xna,Effects,Repeat,我一直在读关于将声音编程到c#XNA游戏中的不同方法的书。我决定使用声音实例进行音量控制,但在播放.wav时,我意识到声音只有在完成后才能再次播放,而如果要求播放,仅使用声音效果.play()(而不是实例)将导致它播放自己的多个副本。所以我的问题是,在一个场景中,按下一个按钮会导致一个单一的声音效果一次播放多次(例如机关枪的重复嗡嗡声等),而不是等到声音文件结束时循环播放;您将如何使用实例?我假设我遗漏了一些东西,或者某个实例不是为这种用途而设计的。如果是,音效的基本选项与音效实例的基本选项之间

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

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

考虑到这一点,你有几个选择。如果您[大概]想在按下按钮时阻止10亿个声音完全播放,那么您绝对不应该使用
SoundEffect.Play()
,正如您所发现的,将创建许多实例(这可能对性能和总体管理非常不利)。对于频率较低的声音,这可能是一个不错的方法

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

我在尝试以“简单”的方式重新启动时遇到问题:

从历史上看,这对我不起作用;如果对您有利,请忽略以下内容:

我要做的是为每个实例设置自己的“重启”标志。因此,我用自己的类包装了
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; }
    }
}

使用此方法,您必须为每个
声音
调用每个帧的Update(),因此请将它们的集合保存在某个地方,或者使它们可以访问。

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

考虑到这一点,你有几个选择。如果您[大概]想在按下按钮时阻止10亿个声音完全播放,那么您绝对不应该使用
SoundEffect.Play()
,正如您所发现的,将创建许多实例(这可能对性能和总体管理非常不利)。对于频率较低的声音,这可能是一个不错的方法

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

我在尝试以“简单”的方式重新启动时遇到问题:

从历史上看,这对我不起作用;如果对您有利,请忽略以下内容:

我要做的是为每个实例设置自己的“重启”标志。因此,我用自己的类包装了
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; }
    }
}
使用此方法,您必须为每个
声音
的每一帧调用Update(),因此请将它们的集合保存在某个位置,或者使它们可以访问