Есть идеи получить новый аудиофайл для воспроизведения с каждым кликом этого урока?

Я немного новичок в AS, но все еще пытаюсь учиться и выполнять то, что кажется трудным. Я буду преобладать!

Код ниже показывает мой прогресс на данный момент. У меня есть UI Loader, у которого есть серия миниатюр. С каждым щелчком по миниатюре загружается новый SWF-файл... ну, я пытаюсь получить внешнюю серию mp3-файлов, чтобы сделать то же самое через XML-файл. До сих пор мне удавалось получить один аудиофайл для воспроизведения при каждом клике И он воспроизводился поверх существующего файла.

Я просто хочу получить новый файл для воспроизведения с каждым миниатюрой И запретить воспроизведение предыдущего аудиофайла, если / когда пользователь щелкнет новый эскиз.

Пожалуйста, помогите, если возможно... помогите мне увидеть ошибки моего пути. Немного ошеломлен.

var imagesXML:XML;
var xmlLoader: URLLoader = new URLLoader();
xmlLoader.addEventlistener(Event.COMPLETE, xmlLoaded);
xmlLoader.load(new URLRequest("lessons/images/Images5.xml"));


/////////////////////////////////////////////////////////////
////////////    thumbnail loader    /////////////////////////

var mySound:Sound;
var myChannel:SoundChannel;


function xmlLoaded(evt:Event):void
{
imagesXML = new XML(xmlloader.data);
var thumbLoader:UILoader;
for(var i:uint = 0; i < imagesXML.image.length(); i++)
    {
        thumbLoader UILoader(getChildByName("thumb" + 1));
        thumbLoader.load(new URLRequest("lessons/images/thumbs/" + imagesXML.image[i].@file));
        thumbLoader.buttonmode = true;
        thumbLoader.addEventListener(MouseEvent.CLICK, thumbClicked);
        var fullPath:String = "lessons/images/file-1.swf";
        mainLoader.load(new URLRequest(fullpath));
    }
}



/////////////////////////////////////////////////////////////
////////////////   load Images  /////////////////////////////

function thumbClicked(evt:MouseEvent):void
{
    var thumbName:String = evt.currentTarget.name;
    var thumbIndex:uint = uint(thumbName.substr(5));
    var fullPath:String = "lessons/images/" + imagesXML.image[thumbIndex].@file;
    mainLoader.load(new URLRequest(fullPath));

//stop any sound playing
    if (myChannel != null)
    {
        myChannel.stop();
    }

// load mp3 file
    mySound = new Sound(); myChannel = new SoundChannel();
    mySound.load(new URLRequest ("lessons/audio/narration/ch1p3.mp3"));
    mySound.play();
}

РЕДАКТИРОВАТЬ

Мне также нужно, чтобы звук воспроизводился динамически, исходя из миниатюры, по которой щелкнули.

Это мой обновленный код:

var imagesXML:XML;
var xmlLoader: URLLoader = new URLLoader();
xmlLoader.addEventlistener(Event.COMPLETE, xmlLoaded);
xmlLoader.load(new URLRequest("lessons/images/Images5.xml"));

var thumbSounds:Dictionary = new Dictionary();


/////////////////////////////////////////////////////////////
////////////    thumbnail loader    /////////////////////////

var mySound:Sound;
var myChannel:SoundChannel;


function xmlLoaded(evt:Event):void
{
imagesXML = new XML(xmlloader.data);
var thumbLoader:UILoader;
for(var i:uint = 0; i < imagesXML.image.length(); i++)
    {
        thumbLoader UILoader(getChildByName("thumb" + 1));
        thumbLoader.load(new URLRequest("lessons/images/thumbs/" + imagesXML.image[i].@file));
        thumbLoader.buttonmode = true;
        thumbLoader.addEventListener(MouseEvent.CLICK, thumbClicked);
        var fullPath:String = "lessons/images/file-1.swf";
        mainLoader.load(new URLRequest(fullpath));
        thumbSounds[thumbLoader] = "lessons/audio/narration/sound/ch1" + i + ".mp3";

 //load mp3 file
       mySound = new Sound(); 
       myChannel = new SoundChannel();
       mySound.load(new URLRequest ("lessons/audio/narration/ch1p3.mp3"));
       myChannel = mySound.play();
    }
}



/////////////////////////////////////////////////////////////
////////////////   load Images  /////////////////////////////

function thumbClicked(evt:MouseEvent):void
{
    var thumbName:String = evt.currentTarget.name;
    var thumbIndex:uint = uint(thumbName.substr(5));
    var fullPath:String = "lessons/images/" + imagesXML.image[thumbIndex].@file;
    mainLoader.load(new URLRequest(fullPath));
//stop any sound playing
    if (myChannel != null)
       {
          trace("HOLD sound");
          SoundMixer.stopAll();
       }
    mySound = new Sound();
    myChannel = new SoundChannel();
    mySound.load(new URLRequest (thumbSounds[evt.currentTarget]));
    myChannel = mySound.play();

    trace("now playing" + thumbSounds[evt.currentTarget]);
}

1 ответ

Решение

Все, что вам не хватает, это заполнение myChannel var со звуковым каналом, который создается и возвращается при вызове play() на звук.

Итак, вместо того, чтобы делать:

myChannel = new SoundChannel();
//this creates an empty sound channel that has no relevance to anything you're doing
//so later when you do myChannel.stop(), you're just stopping this empty channel

Сделай это:

myChannel = mySound.play();
//play returns the relevant sound channel to what you've asked to play

Так должно выглядеть так:

mySound = new Sound();
mySound.load(new URLRequest ("lessons/audio/narration/ch1p3.mp3"));
myChannel = mySound.play();

Читая документацию по функции воспроизведения, вы найдете следующее:

Создает новый объект SoundChannel для воспроизведения звука. Этот метод возвращает объект SoundChannel, к которому вы обращаетесь, чтобы остановить звук и контролировать громкость.


летнее североамериканское восточное время

Чтобы ответить на ваши комментарии, вам нужно как-то связать аудиофайл с каждым элементом UILoader. Вы можете сделать это, расширив класс UILoader и добавив свойство, или вы можете использовать словарь, или вы можете разобрать путь большого пальца для идентификатора.

Я покажу вам словарный подход, поскольку он, вероятно, самый простой:

//at the top of your code with your other vars
var thumbSounds:Dictionary = new Dictionary();

Затем, когда вы создадите элементы UILoader в этом цикле, сделайте следующее:

thumbSounds[thumbLoader] = "lessons/audio/narration/ch1p" + i + ".mp3";
//I'm just guessing on your naming convention above, eg ch1p1.mp3, ch1p2.mp3 etc

Теперь в обработчике кликов, где вы воспроизводите звук, сделайте следующее:

//in an event handler, the event's currentTarget is a reference to item that you added the listener to, in this case the thumb that was clicked.
mySound.load(new URLRequest (thumbSounds[evt.currentTarget]));
Другие вопросы по тегам