2011-07-23 44 views
0

我想要做的是在鼠標向下事件上循環播放聲音,然後在鼠標向上事件中,我想完成它正在進行的迭代並停止循環。循環聲音,但整理最後一次迭代

下面的邏輯應該可以工作,但我不知道爲什麼它不是。

import flash.events.MouseEvent; 
import flash.media.Sound; 
import flash.events.Event; 
import flash.media.SoundChannel; 

//ExplosionSound is .wav file linked in my library. 
var s:Sound=new ExplosionSound(); 
var sc:SoundChannel = new SoundChannel(); 

stage.addEventListener(MouseEvent.MOUSE_DOWN, loopSound); 
stage.addEventListener(MouseEvent.MOUSE_UP, stopLoop); 

function loopSound(e:MouseEvent):void { 
    sc=s.play(0,9999); 

} 

function stopLoop(e:MouseEvent):void { 
    sc.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler); 
} 

function soundCompleteHandler(e:Event):void{ 
    sc.removeEventListener(Event.SOUND_COMPLETE, soundCompleteHandler); 
    sc.stop(); 
} 

我只能把sc.stop();在我的stopLoop()函數中,但立即停止聲音。

例如,我需要的是:假設您有機槍射擊,當您停止拍攝時,最後一個子彈聲音不會立即停止,它會結束。

希望這是有道理的。

謝謝你的一切幫助。

+0

ExplosionSound不是原生Flash類,您沒有提供代碼;很難給你一個關於它可能有什麼問題的答案。我不相信這與Flex有關,所以我刪除了該標籤;我還添加了Flash標籤。 – JeffryHouser

+0

它在代碼的評論 - ExplosionSound是從圖書館出口的wav – pkyeck

回答

1

SOUND_COMPLETE「never」在循環聲音時被觸發 - 只會在第9999次循環後觸發。所以你必須要解決此問題:

import flash.events.MouseEvent; 
import flash.media.Sound; 
import flash.events.Event; 
import flash.media.SoundChannel; 

//ExplosionSound is .wav file linked in my library. 
var s:Sound=new ExplosionSound(); 
var sc:SoundChannel = new SoundChannel(); 

var isMouseDown:Boolean = false; 

stage.addEventListener(MouseEvent.MOUSE_DOWN, loopSound); 
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUpHandler); 

function loopSound(e:MouseEvent):void { 
    isMouseDown = true; 
    playSound(); 
} 

function playSound():void 
{ 
    sc=s.play(0); 
    sc.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler); 
} 

function onMouseUpHandler(e:MouseEvent):void { 
    isMouseDown = false; 
} 

function soundCompleteHandler(e:Event):void{ 
    sc.removeEventListener(Event.SOUND_COMPLETE, soundCompleteHandler); 
    sc.stop(); 

    if (isMouseDown) 
    { 
     playSound(); 
    } 
} 

只播放聲音一次在鼠標按下(但保持一個標誌鼠標是否仍然向下),並添加一個SOUND_COMPLETE處理程序。如果聲音完成並且鼠標仍然關閉,請重播聲音。如果鼠標按鈕被釋放,則標誌被重置,並且完成時聲音不會重播。tataaaaa

+0

+1 - 正準備發佈幾乎相同的東西 – shanethehat

+0

感謝您的回覆。這就是我以前一直在做的事情,但聲音完成後會有明顯的延遲。 s.play(0,9999);是真正的無縫循環。我做了這樣的事情: 功能stopLoop(五:MouseEvent)方法:(!sc.position = 0){無效 \t如果{ \t \t的setTimeout(函數(){sc.stop();},s.length- sc.position); \t} else { \t \t sc.stop(); \t} } – bob

+0

@bob無縫循環在AS中確實是一個大問題。這裏有一篇關於無縫循環外部MP3的文章,也許這是一個選擇? http://blog.andre-michelle.com/2010/playback-mp3-loop-gapless/ – pkyeck

相關問題