2012-03-14 44 views
2

所以。无需发布大量代码。基本上我正在做的是使用ActionScript3在flash cs5中将一些声音导入到我的fla文件中。Flash AS3通过removeChild去除movieclip后播放的声音

我有一个soundchannels创建和在主类中创建的声音的实例。

在构造函数中,我有用addChild创建的第一个场景。我也通过声道初始化背景音乐声音。

问题是,我想要在第一个场景的第40帧上播放音效。如果我只是将声音放入播放的时间线中,但在场景2被删除以便插入场景2后,该声音效果将继续播放。我也尝试在第40帧上使用动作来播放声音,但是也会在removeChild后循环播放。

这样做的正确方法是什么?我宁愿将所有的代码保存在主类中,但如果我必须将脚本添加到单个场景中,我会为其付出代价。只是想我可以让声音停止循环!

回答

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代码。

- 编辑:的确这样做了正确的方法是不实际的时间表内

当您创建对象,事件添加到它:当你执行removeChild(myObjectWithSoundInside)

myObjectWithSoundInside.addEventListener(Event.REMOVED_FROM_STAGE, objRemoved) 

function objRemoved (event:Event):void { 
    // This is where you SoundChannel.stop() 
} 

然后,声音应该停止,假设objRemoved的内部代码是正确的并且引用良好。

+0

感谢您的回复ido!因此,如果在对象(scene1)中,我选择使用REMOVED_FROM_STAGE事件,那么我是否也会在第40帧内构建函数?我也可以在第40帧创建声道和声音对象吗?因为当我试图从movieclip中访问频道时,它会给我一个错误,所以我必须将频道和声音实例放入对象中,这似乎是一种可怕的方式。 – nobi 2012-03-14 05:03:03

+0

让他们在时间线内真的是一个不好的方法来做到这一点。我只是不确定我了解你的项目的结构。 无论如何,同样的事情 - 您也可以从外部取消REMOVED_FROM_STAGE事件,并且您确实有适当的引用来停止SoundChannel。检查我更新的答案,希望这有助于。 – ido 2012-03-14 14:01:05

1

您需要在SoundChannel的任何实例上使用SoundChannel.stop()来处理相关声音。

与其将时间线上的声音插入,我建议根据this example加载和播放声音,以便您访问需要的SoundChannel实例。

1

我有同样的问题,我的父剪辑正在加载一个孩子的声音是一些帧到剪辑(它被延迟)。移除孩子只能移除观看的舞台,但声音仍在循环播放。我插入这个代码到那里的声音是在儿童影片剪辑播放帧和所有固定:

if (this.stage == null) { 
    SoundMixer.stopAll(); 
} 

现在每当孩子被移除循环停止。我必须为每个关键帧执行此操作,以便在孩子中播放声音片段。

+0

好,很酷,谢谢你的想法,我想我最终使用了这样的东西。此外,我认为将它放在类定义中而不是关键帧可能会更好,这样您可以将所有代码放在同一个地方并且不在时间轴上。 – nobi 2012-05-06 01:48:48