2014-04-29 26 views
2

我已经写了一个loadSound函数来处理加载和播放多个声音。当我在另一个关键帧中调用这个函数时,这个函数可以正常工作,即函数没有被写入的帧。但是当我在功能写入的同一帧上调用函数时,声音会混淆。例如,该函数被写入第一个关键帧。如果我在第2,3,4个关键帧(用不同的声音)调用这个函数,它可以正常工作。但是,当我在第一,第二和第三关键帧中调用相同的函数时,它们都会变得混乱。 在第一个关键帧中声音播放正常。当我移动到第二个关键帧时,第二个声音播放。但是当我回到第一个关键帧时,第二个和第一个关键帧的声音都混在一起了。当我在第2,3,4个关键帧中调用该函数时,不会发生这种情况。ActionScript 3.0加载和播放多个声音

下面是我的函数:

import flash.events.Event; 
import flash.media.Sound; 
import flash.net.URLRequest; 
import flash.events.ProgressEvent; 
import flash.events.IOErrorEvent; 
import flash.errors.IOError; 
import flash.media.SoundChannel; 
import flash.media.SoundMixer; 
import flash.events.TimerEvent; 
import flash.utils.Timer; 
import flash.display.MovieClip; 
import flash.media.SoundTransform; 

stop(); 

var s:Sound; 
var localSound:SoundChannel = new SoundChannel(); 
var req:URLRequest; 
var loadedPct:uint; 
var currentFrameArr:Array = ["One","Two","Three"]; 
var urlArr:Array = ["sound/m01_t01_s01.mp3","sound/m01_t01_s02.mp3","sound/page10_11.mp3"]; 



function loadSnd(currentFrm:String) 
{ 
    s = new Sound(); 
    s.addEventListener(ProgressEvent.PROGRESS, onSoundProgress); 
    s.addEventListener(Event.COMPLETE, onSoundLoaded); 
    s.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 

    localSound.stop(); 

    for (var i:uint=0; i<currentFrameArr.length; i++) 
    { 
     if (currentFrm == currentFrameArr[i]) 
     { 
      req = new URLRequest(urlArr[i]); 
      break; 
     } 
    } 
    s.load(req); 
} 

function onSoundProgress(evt:ProgressEvent):void 
{ 
    loadedPct = Math.round(100 * (evt.bytesLoaded/evt.bytesTotal)); 
    trace("The sound is " + loadedPct + " % loaded"); 
} 

function onSoundLoaded(evt:Event):void 
{ 
    localSound = s.play(); 
} 

function onIOError(evt:IOErrorEvent):void 
{ 
    trace("The sound could not be loaded: " + evt.text); 
} 

调用该函数在不同的帧:

loadSnd("One"); 
loadSnd("Two"); 

如果我通过参数 '一' 在loadSnd它起着第一urlArray中的元素,'Two'第二元素等等。

但是,如果我在我的按钮中包含soundChannel.stop()它虽然工作正常。尽管我希望将它嵌入到函数本身中,因为我打算编写一个类文件,以便将其包含在我的项目中。下面的代码,如果包括工程就好了。

nextBtn.addEventListener(MouseEvent.CLICK, onNextClk); 
function onNextClk(evt:MouseEvent):void 
{ 
      localSound.stop(); 
      this.nextFrame(); 
} 


prevBtn.addEventListener(MouseEvent.CLICK, onPrevClk); 
function onPrevClk(evt:MouseEvent):void 
{ 
      localSound.stop(); 
      this.prevFrame(); 
} 

我也在想,如果框架没有例如鼠标点击改变会发生什么,如果一个动画结束和一个新的关键帧开始,我想包括在关键帧不同的声音文件。 如果soundChannel.stop()包含在函数本身中,无论发生什么事件,鼠标点击按钮或动画结束,它都会停止以前的声音并播放一个新的声音。

任何帮助将不胜感激,因为我长期以来一直在挠头。

回答

0
Got the Solution. The SoundMixer.stopAll(); statement did the trick. The complete workable function is pasted below: 

import flash.events.Event; 
import flash.media.Sound; 
import flash.net.URLRequest; 
import flash.events.ProgressEvent; 
import flash.events.IOErrorEvent; 
import flash.errors.IOError; 
import flash.media.SoundChannel; 
import flash.media.SoundMixer; 
import flash.events.TimerEvent; 
import flash.utils.Timer; 
import flash.display.MovieClip; 
import flash.media.SoundTransform; 

stop(); 

var s:Sound; 
var localSound:SoundChannel = new SoundChannel(); 
var req:URLRequest; 
var loadedPct:uint; 
var currentFrameArr:Array = ["One","Two","Three"]; 
var urlArr:Array = ["sound/m01_t01_s01.mp3","sound/m01_t01_s02.mp3","sound/page10_11.mp3"]; 

function loadSnd(currentFrm:String) 
{ 
    s = new Sound(); 
    s.addEventListener(ProgressEvent.PROGRESS, onSoundProgress); 
    s.addEventListener(Event.COMPLETE, onSoundLoaded); 
    s.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 

    SoundMixer.stopAll(); 
    localSound.stop(); 

    for (var i:uint=0; i<currentFrameArr.length; i++) 
    { 
     if (currentFrm == currentFrameArr[i]) 
     { 
      req = new URLRequest(urlArr[i]); 
      break; 
     } 
    } 
    s.load(req); 
} 

function onSoundProgress(evt:ProgressEvent):void 
{ 
    loadedPct = Math.round(100 * (evt.bytesLoaded/evt.bytesTotal)); 
    trace("The sound is " + loadedPct + " % loaded"); 
} 

function onSoundLoaded(evt:Event):void 
{ 
    localSound = s.play(); 
} 

function onIOError(evt:IOErrorEvent):void 
{ 
    trace("The sound could not be loaded: " + evt.text); 
} 

Calling the function: 

loadSnd("One"); 
loadSnd("Two"); etc