AS3 воспроизводит второй аудиофайл после завершения первого - PullRequest
0 голосов
/ 15 октября 2011

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

Я загружаю звук, подобный этому:

var mySound:Sound = new Sound();
mySound.load(new URLRequest("audio/filename.mp3"));
mySoundChannel:SoundChannel = mySound.play();

Затем я добавляю слушателя и пытаюсь вызвать функцию с событием SOUND_COMPLETE, например:

mySoundChannel.addEventListener(Event.SOUND_COMPLETE,audioComplete);
function audioComplete(Event:Event){
trace("done!");
}

Тем не менее, я получаю эту ошибку: «1046: Тип не найден или не был константой времени компиляции: Event.»

Может кто-нибудь дать мне подсказку о том, что я делаю неправильно?

Спасибо.

Ответы [ 4 ]

1 голос
/ 15 октября 2011

Изменение

function audioComplete(Event:Event){

до

function audioComplete(event:Event){

AS чувствителен к регистру. event - это не то же самое, что Event. Event - это название класса. event - это имя, которое вы назначаете локальной переменной типа Event

Более того, звук загружается во Flash асинхронно. Это означает, что при вызове sound.load() Flash Player начнет загрузку звука в новом потоке и продолжит следующие строки кода во время загрузки звука. Событие Event.COMPLETE запускается, когда этот звук полностью загружен, NOT , когда воспроизведение звука закончено.

, чтобы вызвать функцию после завершения воспроизведения звука, используйте setTimeout

var mySound:Sound = new Sound();
mySound.load(new URLRequest("audio/filename.mp3"));
mySound.addEventListener(Event.COMPLETE, soundLoaded);

function soundLoaded(e:Event):void {
    mySound.play();
    setTimeout(audioComplete, mySound.length);
}
function audioComplete(){
    trace("done!");
}
0 голосов
/ 19 октября 2011

Спасибо тем, кто откликнулся. Я закончил тем, что нашел лучший способ сделать это. Если кто-то сталкивается с той же проблемой, вот что работает для меня:

var mySound:Sound = new Sound();
var mySoundURL:URLRequest = new URLRequest("myfile.mp3");
var mySoundChannel:SoundChannel = new SoundChannel();
mySound.load(mySoundURL);
mySoundChannel = mySound.play();
mySoundChannel.addEventListener(Event.SOUND_COMPLETE, endMySound);

function endMySound(e:Event):void{
trace("sound is complete!");
}
0 голосов
/ 15 октября 2011

Импорт класса события: import flash.events.Event

package
{
    
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.net.URLRequest;

    
    public class Test extends Sprite
    {
        
        private var _sound : Sound:
        private var _soundChannel : SoundChannel:

        public function Test() : void
        {
            playSound("audio/filename.mp3");
        }
    
        private function playSound(url : String) : void
        {
            // start sound here
            _sound = new Sound();
            _sound.load(new URLRequest(url));
            _soundChannel = mySound.play();

            _soundChannel.addEventListener(Event.SOUND_COMPLETE, onSoundComplete);
        }

        private function onSoundComplete(event : Event) : void
        {
            // sound is complete
            _soundChannel.removeEventListener(Event.SOUND_COMPLETE, onSoundComplete);

            // play next sound
        }
    }   
}
0 голосов
/ 15 октября 2011

Попробуйте изменить

function audioComplete(Event:Event){

на

function audioComplete(e:Event){

Хорошая идея - не использовать имена классов для имен переменных.Это может запутать компилятор и программистов, пытающихся прочитать код.

...