Я написал функцию loadSound, которая обрабатывает загрузку и воспроизведение нескольких звуков. Эта функция отлично работает, когда я вызываю эту функцию в другом ключевом кадре, то есть в кадре, в котором функция не записана. Но когда я вызываю функцию в том же кадре, в котором она написана, звуки смешиваются. Например, функция написана в 1-м ключевом кадре. Если я вызываю эту функцию во 2-м, 3-м и 4-м ключевом кадре (с разными звуками), она работает нормально. Но когда я вызываю одну и ту же функцию в 1-м, 2-м и 3-м ключевом кадре, все портится. В 1-м ключевом кадре звук воспроизводится правильно. Когда я перехожу ко второму ключевому кадру, воспроизводится второй звук. Но когда я возвращаюсь к 1-му ключевому кадру, звуки 2-го и 1-го ключевых кадров смешиваются. Этого не происходит, когда я вызываю функцию во 2-м, 3-м и 4-м ключевых кадрах.
Ниже моя функция:
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, он воспроизведет 1-й элемент в urlArray, 2-й элемент «Два» и так далее.
Но если я включу 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() включен в саму функцию, независимо от того, какое событие происходит, будь то щелчок мышью по кнопке или конец анимации, он остановит предыдущий звук и воспроизведет новый.
Любая помощь будет принята с благодарностью, так как я долго ломаю над этим голову.