因此。没有发布大量的代码。基本上我正在做的是使用ActionScript3将一些声音导入到flash cs5中的fla文件中。
我创建了一个声道,并在主类中创建了声音的实例。
在构造函数中,我使用addChild创建了第一个场景。我还通过声道初始化背景音乐声音。
问题是,我希望在第一个场景的第40帧上播放声音效果。如果我只是将声音放入它播放的时间轴中,但在移除场景2以插入场景2之后,该声音效果将继续播放。我也尝试在第40帧上使用actionscript来播放声音,但是在removeChild之后也会循环播放。
这样做的正确方法是什么?我更喜欢将所有代码保存在主类中,但如果我必须将脚本添加到各个场景中,那么我就可以了。只是希望我能听到停止循环的声音!!!
答案 0 :(得分:1)
您需要在SoundChannel
的任何实例上使用SoundChannel.stop()
来对相关声音负责。
不是将声音插入时间轴,而是建议按照this example加载和播放声音,这样您就可以访问所需的SoundChannel
实例。
答案 1 :(得分:1)
我遇到了同样的问题,我的父剪辑正在加载一个孩子,声音是剪辑中的一些帧(它被延迟了)。删除子项只删除了已查看的阶段,但声音仍在循环播放。我将此代码插入到儿童电影剪辑中播放声音的帧中,并且所有内容都已修复:
if (this.stage == null) {
SoundMixer.stopAll();
}
现在每当孩子被移除时,循环停止。我必须为每个关键帧做一个声音片段在孩子身上播放。
答案 2 :(得分:0)
removeChild不负责停止任何声音,它只从子列表中删除displayObject,然后直观地删除它。
如果你想停止你开始的声音,你在调用removeChild时需要引用该SoundChannel。然后只需使用SoundChannel.stop()http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/SoundChannel.html#stop()
我需要更多信息才能提供更准确的答案。
你说过你试过的其中一个选项是在时间轴内,第40帧播放声音。然后问题是如果displayObject已被删除,它仍然会播放。在这种情况下,这不是我最喜欢的解决方案但应该有效,你可以这样做:
// on frame 40
if (this.stage != null) {
// play sound here
}
这意味着如果这个displayObject的阶段存在(如果它仍然在舞台上,也就是说,作为一个孩子被添加并且还没有被移除)那么内部代码就会执行。如果突然移除,声音仍将播放。您仍然需要SoundChannel的引用来阻止它。如果从对象内部,您可以使用addEventListener(Event.REMOVED_FROM_STAGE, func)
来了解对象何时被删除,并在引用的函数内执行SoundChannel.stop代码。
- 编辑:确实,这样做的正确方法不在实际时间线内
创建对象时,将事件添加到其中:
myObjectWithSoundInside.addEventListener(Event.REMOVED_FROM_STAGE, objRemoved)
function objRemoved (event:Event):void {
// This is where you SoundChannel.stop()
}
然后当你执行removeChild(myObjectWithSoundInside)
时,声音应该停止,假设objRemoved的内部代码是正确的并且引用良好。