Есть идеи получить новый аудиофайл для воспроизведения с каждым кликом этого урока?
Я немного новичок в 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]));