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