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代码。
- 编辑:的确这样做了正确的方法是不实际的时间表内
当您创建对象,事件添加到它:当你执行removeChild(myObjectWithSoundInside)
myObjectWithSoundInside.addEventListener(Event.REMOVED_FROM_STAGE, objRemoved)
function objRemoved (event:Event):void {
// This is where you SoundChannel.stop()
}
然后,声音应该停止,假设objRemoved的内部代码是正确的并且引用良好。
来源
2012-03-14 04:01:34
ido
感谢您的回复ido!因此,如果在对象(scene1)中,我选择使用REMOVED_FROM_STAGE事件,那么我是否也会在第40帧内构建函数?我也可以在第40帧创建声道和声音对象吗?因为当我试图从movieclip中访问频道时,它会给我一个错误,所以我必须将频道和声音实例放入对象中,这似乎是一种可怕的方式。 – nobi 2012-03-14 05:03:03
让他们在时间线内真的是一个不好的方法来做到这一点。我只是不确定我了解你的项目的结构。 无论如何,同样的事情 - 您也可以从外部取消REMOVED_FROM_STAGE事件,并且您确实有适当的引用来停止SoundChannel。检查我更新的答案,希望这有助于。 – ido 2012-03-14 14:01:05