2012-03-11 28 views
0

基本上我有一個聲音效果,當兩個項目在我的遊戲中相撞時播放。有些項目彼此非常接近,所以聲音效果可能必須快速連續播放。允許XNA SoundEffectInstance自己播放

使用SoundEffect.Play()可以使用。但是爲了保存垃圾收集,我想使用一個實例。不幸的是,這意味着一個實例不會播放,直到最後一個播放完畢。這不是我所追求的效果。有什麼方法可以重寫這個功能,否則我必須返回普通的舊SoundEffect?

+0

可能重複[從一個實例重複聲音](http://stackoverflow.com/questions/8994292/repeating-sound-from-one-instance) – 2014-05-08 01:59:45

回答

1

你有什麼理由要「節省垃圾收集?」除非你開始遇到實際的性能問題,否則很可能不需要擔心它。根據個人經驗,您可以快速連續播放至少一打聲音(使用SoundEffect.Play()),不會有任何問題。然而,如果你覺得你的遊戲有很多碰撞,你可以做兩件事:

首先,考慮創建一個簡單的SoundPlayer類來處理所有你玩的聲音,並且每當你發現超過10個同時玩的時候,防止下一個被玩。如果發生很多碰撞,玩家不會注意到缺少聲音。

其次,請看這裏(http://forums.create.msdn.com/forums/t/91165.aspx)關於如何使用DynamicSoundEffectInstance來預混聲音。這有點複雜一些,但通過展望未來,將所有即將播放的聲音混合到單個緩衝區中,幾乎可以保證零延遲,因爲只有一個聲音(或一個音頻流緩衝區)有效播放。

+0

啊,如果沒有簡單的方法來做它可能它精細。在我的遊戲中,它不可能同時發生10次或更多次的碰撞,所以我會留下它與正常SoundEffect.Play()的關係。感謝您的想法。 – DanTonyBrown 2012-03-11 16:34:46

0
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); 
    } 

由於設置一個愚蠢的價值將下降一個例外。