每当我翻转一个物体时,我都会发出声音。为了减少烦恼,我希望声音只有在没有播放的情况下播放。由于我需要使用几种不同的声音,我不想使用计时器(如果不是绝对必要的话)。我发现了这个:
var channel:SoundChannel = snd.play();
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
public function onPlaybackComplete(event:Event)
{
trace("The sound has finished playing.");
}
但我不确定我能用它,因为我也有背景音乐。有什么提示吗?
答案 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管理或其他类型的声音。