你可以選擇性地使用這種技巧。不過,如果你打算有很多這樣的對象在鼠標懸停的時候觸發聲音,你可能會決定擁有一個管理類或數據表,每個這樣的對象都有一個條目,並且它的字段在聲音被播放,並且如此分配的聽衆將清除該字段中的值,從註冊的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管理或其他類型的聲音。
如果您需要管理多種聲音,那麼可以考慮採用像聲音管理器這樣的集中式方法 - 開啓/關閉全局聲音,控制多種聲音/相同聲音等等。其中有很多是https:/ /github.com/treefortress/SoundAS,http://evolve.reintroducing.com/2011/01/06/as3/as3-soundmanager-v1-4/,google _as3 sound mananer_ for more – fsbmain