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