List<SoundEffectInstance> explosionSoundInstanceList;
explosionSound = Content.Load<SoundEffect>("sound/explosion");
explosionSoundInstanceList = new List<SoundEffectInstance>(MAX_EXPLOSIONS);
for (int i = 0; i < MAX_EXPLOSIONS; i++)
{
explosionSoundInstanceList.Add(explosionSound.CreateInstance());
}
private void PlayExplosionSound(float volume, float pitch, float pan)
{
ClampSoundValues(ref volume, ref pitch, ref pan);
for (int i = 0; i < explosionSoundInstanceList.Count; i++)
{
if (explosionSoundInstanceList[i].State == SoundState.Stopped)
{
explosionSoundInstanceList[i].Volume = volume / (i+1);
explosionSoundInstanceList[i].Pitch = pitch;
explosionSoundInstanceList[i].Pan = pan;
explosionSoundInstanceList[i].Play();
return;
}
}
return;
}
正常に動作します。インスタンス化後の 360 でのゼロ ガベージ。制限に達した後、エレガントに失敗します。
それが私が使っているものです。
このように値をクランプします
private static void ClampSoundValues(ref float volume, ref float pitch, ref float pan)
{
volume = MathHelper.Clamp(volume, -1f, 1f);
pitch = MathHelper.Clamp(pitch, -1f, 1f);
pan = MathHelper.Clamp(pan, -1f, 1f);
}
愚かな値を設定すると、例外がドロップされます。