ActionScript 3.0 Загрузка и воспроизведение нескольких звуков

Я написал функцию 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() включен в саму функцию, независимо от того, какое событие происходит, будь то щелчок мышью по кнопке или конец анимации, он остановит предыдущий звук и воспроизведет новый.

Любая помощь будет принята с благодарностью, так как я долго ломаю над этим голову.


person user3584855    schedule 29.04.2014    source источник