2015-12-22 77 views
0

我有一個聲音播放每當我翻轉一個對象。爲了減少惱人的聲音,我希望聲音只在未播放時播放。由於我需要一些不同的聲音,所以我不想使用計時器(如果不是絕對必要的話)。我發現這個:AS3簡單的方法來檢查聲音是否完成

var channel:SoundChannel = snd.play(); 
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete); 

public function onPlaybackComplete(event:Event) 
{ 
    trace("The sound has finished playing."); 
} 

但我不知道我可以使用它,因爲我也有背景音樂。有小費嗎?

+0

如果您需要管理多種聲音,那麼可以考慮採用像聲音管理器這樣的集中式方法 - 開啓/關閉全局聲音,控制多種聲音/相同聲音等等。其中有很多是https:/ /github.com/treefortress/SoundAS,http://evolve.reintroducing.com/2011/01/06/as3/as3-soundmanager-v1-4/,google _as3 sound mananer_ for more – fsbmain

回答

0

你可以選擇性地使用這種技巧。不過,如果你打算有很多這樣的對象在鼠標懸停的時候觸發聲音,你可能會決定擁有一個管理類或數據表,每個這樣的對象都有一個條目,並且它的字段在聲音被播放,並且如此分配的聽衆將清除該字段中的值,從註冊的SoundChannel s中導出正確的條目。預製音響經理會做,但你最好做一個定製的。舉個例子:

public class SoundManager { 
    private var _fhOPO:Dictionary; 
    private var _bhOPO:Dictionary; 
    // going sophisticated. Names stand for "forward hash once per object" and "backward" 
    // forward hash stores links to SoundChannel object, backward stores link to object from 
    // a SoundChannel object. 
    // initialization code skipped 
    public static function psOPO(snd:Sound,ob:Object):void 
    { 
     // platy sound once per object 
     if (_fhOPO[ob]) return; // sound is being played 
     var sc:SoundChannel=snd.play(); 
     _fhOPO[ob]=sc; 
     _bhOPO[sc]=ob; 
     sc.addEventListener(Event.SOUND_COMPLETE, _cleanup); 
    } 
    private static function _cleanup(e:Event):void 
    { 
     var sc:SoundChannel=event.target as SoundChannel; 
     if (!sc) return; // error handling 
     var ob:Object=_bhOPO[sc]; 
     _bhOPO[sc]=null; 
     _fhOPO[ob]=null; // clean hashes off now obsolete references 
     sc.removeEventListener(Event.SOUND_COMPLETE, _cleanup); 
     // and clean the listener to let GC collect the SoundChannel object 
    } 
} 

然後,當你需要播放聲音,但限制每個對象的頻道的一個實例,你叫SoundManager.psOPO(theSound,this);提供一個按鈕參考,而不是this如果需要的話。如果需要,您可以使用普通Sound.play()以及此類聲音管理,或者在需要時使用其他類型的BGM管理或其他類型的聲音。

相關問題