从一个实例重复声音

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

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(),因此请将它们集合在某处或以其他方式访问它们。