Важно решить, как вы собираетесь управлять количеством играющих SoundEffectInstances
одновременно?Очевидный способ - изменить код игрового процесса (или уровни, или что-то еще) так, чтобы количество игровых звуков просто никогда не становилось слишком большим.
Но если это неприемлемо, вам нужно каким-то образом установить жесткий лимит.И вопрос: как вы собираетесь это сделать?Будет ли у каждого звукового эффекта максимальное количество экземпляров этого эффекта?Или у вас будут «классы звука» (где класс имеет максимальное количество игр)?Или просто общее максимальное количество звука?Будет ли ограничено использование дополнительных звуков?Или, обрезая звуки, которые уже воспроизводятся?
Я бы предложил создать объект-оболочку вокруг SoundEffect
, который реализует почти то же самое, что и SoundEffect.Play
(он внутренне управляет пулом * 1008).* 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
, вы можете позаимствовать его код пула, который похож на то, что делает настоящий XNA SoundEffect
, а затем использовать его в качестве отправной точки для вашего собственного пула экземпляров с добавленной функциональностью.
Есть и другие способы сделать это, и это будет зависеть от вашей архитектуры.Но в основном вы должны отслеживать связь между звуковыми эффектами и экземплярами .Нет никакого способа сделать это в API XNA (если не считать некоторых неприятных размышлений).