AS3检查声音是否完成的简单方法

时间:2015-12-22 10:17:30

标签: actionscript-3 flash

每当我翻转一个物体时,我都会发出声音。为了减少烦恼,我希望声音只有在没有播放的情况下播放。由于我需要使用几种不同的声音,我不想使用计时器(如果不是绝对必要的话)。我发现了这个:

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

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

但我不确定我能用它,因为我也有背景音乐。有什么提示吗?

1 个答案:

答案 0 :(得分:0)

你可以有选择地使用这样的技巧。尽管如此,如果你计划有很多这样的对象在鼠标悬停时触发声音,你可能会决定让每个这样一个对象都有一个条目的管理器类或数据表,如果是播放声音,并且这样分配的监听器将清除该字段中的值,从已注册的Tab Bar Item集合中导出正确的条目。一个预制的声音管理器会做,但你最好做一个量身定制的。一个例子:

SoundChannel

然后,每当您需要播放声音但限制为每个对象的一个​​频道实例时,如果需要,可以调用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以及此类声音管理,或者在需要时使用其他类型的BGM管理或其他类型的声音。