2012-03-14 77 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