要决定的重要事情是您将如何管理SoundEffectInstances
一次播放的数量?显而易见的方法是修改您的游戏代码(或关卡或其他),以使播放声音的数量永远不会变得太大。
但是,如果这是不可接受的,您将需要以某种方式强制执行硬限制。问题是:你打算怎么做?每个声音效果都会有该效果的最大实例数吗?或者你会有“声音课程”(课程有最大的播放次数)?还是只是全局最大声音数?是否会通过阻止播放额外的声音来强制执行上限?或者通过切断已经播放的声音?
我建议的是围绕它创建一个包装器对象,SoundEffect
它实现了几乎相同的事情SoundEffect.Play
(它在内部管理一个SoundEffectInstance
s 池,在它们完成播放时重用它们)。然后在其上添加您的播放上限功能。
所以你的包装类可能看起来像这样:
class MySoundEffect
{
SoundEffect sound;
List<SoundEffectInstance> instances;
int maxInstances;
}
或者可能是这样的:
class MySoundEffect
{
static int[] soundClassMaximums = { 2, 2, 5, 10 };
static int[] soundClassInstanceCount;
SoundEffect sound;
List<SoundEffectInstance> instances;
int class;
}
然后你会MySoundEffect
在你通常使用的任何地方使用SoundEffect
.
看看ExEn。因为它实现了 的内部结构SoundEffect
,所以您可以借用它的池代码,这类似于真正的 XNASoundEffect
所做的,然后将其用作您自己的实例池的起点,并添加您的功能。
还有其他方法可以做到这一点,这取决于您的架构。但基本上由您来跟踪音效和实例之间的关联。在 XNA API 中没有办法做到这一点(没有做一些讨厌的反射)。