Как передать динамический URL из XML в событие мыши onClick в ActionScript 3? - PullRequest
1 голос
/ 16 декабря 2008

Я загружаю XML, и я могу читать узлы XML в текстовые поля в моей флэш-памяти. Он также загружает URL, но последний из цикла. Он не загружает тот, на который я нажимаю. Я пытался использовать event.target, но это не работает. Я довольно близок к тому, чтобы понять это, я просто не знаю, где искать.

// loads xml 
var xml:XML = new XML();
var loader:URLLoader = new URLLoader();
loader.load(new URLRequest(audioPlaylist));
loader.addEventListener(Event.COMPLETE, onComplete);

function onComplete(evt:Event):void {
        xml = XML(evt.target.data);
        xmlList = xml.children();
        trace(xmlList);
        trackLength = xmlList.children().children().length();
        trace(trackLength);

        for(var i:int = 0; i < trackLength; i++) {
            trace(i);
            var track:Playlist_item = new Playlist_item();
            track.y = i * 28;

            track.playlist_text.text = xmlList.children().track[i].toString();
            trackURL = xmlList.children().track[i].@rel.toString();

            trace(trackURL);

            playlist_container.addChild(track);
            track.buttonMode = true;
            track.mouseChildren=false;

            track.addEventListener(MouseEvent.MOUSE_OVER, onCarHover);
            track.addEventListener(MouseEvent.MOUSE_OUT, onCarOut);
            track.addEventListener(MouseEvent.CLICK, onClickLoadData);

        }

}

function onCarHover(event:MouseEvent):void {
    event.target.gotoAndStop(6);
}

function onCarOut(event:MouseEvent):void {
    event.target.gotoAndStop(10);
}

function onClickLoadData(event:MouseEvent):void {
    ns.play(trackURL);
}

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

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

// xml variables
var xmlList:XMLList;
var trackLength:Number;
var trackURL;
var trackNum:Number = -1;
var tracksArray:Array = new Array();


// loads xml 
var xml:XML = new XML();
var loader:URLLoader = new URLLoader();
loader.load(new URLRequest(audioPlaylist));
loader.addEventListener(Event.COMPLETE, onComplete);

function onComplete(evt:Event):void {
        xml = XML(evt.target.data);
        xmlList = xml.children();
        trace(xmlList);
        trackLength = xmlList.children().children().length();

        while (trackNum < trackLength) {
            trackNum = trackNum + 1;
            trace(trackNum);

            var track:Playlist_item = new Playlist_item();
            track.y = trackNum * 28;
            playlist_container.addChild(track);

            track.buttonMode = true;
            track.mouseChildren=false;

            track.playlist_text.text = xmlList.children().track[trackNum].toString();
            //trackURL = xmlList.children().track[trackNum].@rel.toString();

            tracksArray[trackNum] = xmlList.children().track[trackNum].@rel.toString();

            track.addEventListener(MouseEvent.MOUSE_OVER, onCarHover);
            track.addEventListener(MouseEvent.MOUSE_OUT, onCarOut);
            track.addEventListener(MouseEvent.CLICK, onClickLoadData);

        }   

}

function onCarHover(event:MouseEvent):void {
    event.target.gotoAndStop(6);
}

function onCarOut(event:MouseEvent):void {
    event.target.gotoAndStop(10);
}

function onClickLoadData(event:MouseEvent):void {

    trace(tracksArray[5]);

    trace(event.target.trackNum);
    ns.play(tracksArray[5]);
}

Ответы [ 2 ]

1 голос
/ 18 декабря 2008

Мне кажется, что вы сделали это тяжело для себя. Я могу ошибаться, так как трудно пройти через код, который вы представили. Концепция списка воспроизведения XML и нажатия на экранный объект для воспроизведения звуков довольно проста, и я продемонстрирую это.

XML

<?xml version="1.0" encoding="utf-8"?>
<xml>
    <item title="Song 1" path="audio/song1.mp3" />
    <item title="Song 2" path="audio/song2.mp3" />
    <item title="Song 3" path="audio/song3.mp3" />
    <item title="Song 4" path="audio/song4.mp3" />
    <item title="Song 5" path="audio/song5.mp3" />
    <item title="Song 6" path="audio/song6.mp3" />
</xml>

Код ActionScript 3

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.net.URLLoader;
    import flash.net.URLRequest;

    public class DocumentClass extends Sprite
    {
        private var _urlLoader:URLLoader;
        private var _urlRequest:URLRequest;
        private var _xml:XML;
        private var _xmlList:XMLList;

        public function DocumentClass():void
        {
            _urlLoader = new URLLoader();
            _urlRequest = new URLRequest();
            _urlRequest.url = 'path/to/playlist.xml';

            _urlLoader.addEventListener(Event.COMPLETE, onXMLLoaded);
            _urlLoader.load(_urlRequest);
        }
        private function onXMLLoaded(e:Event):void
        {
            _xml = new XML(e.target.data);
            _xmlList = new XMLList(_xml.item);

            //We use the index in the XML object as its ID. (The XML object/List is an array);
            for(var i:int = 0; i < _xmlList.length(); i++)
            {
                var s:MovieClip = new MovieClip();
                addChild(s);
                s.mouseChildren = false;

                var tf:TextField = new TextField();
                tf.text = _xmlList[i].@title;
                tf.y = i * 12 + 20; //Seperates the textfields by 12 px starting at y:20;
                s.path = _xmlList[i].@path;
                s.addChild(tf);
                s.addEventListener(MouseEvent.MOUSE_DOWN, onSDown);
            }
        }
        private var onSDown(e:MouseEvent):void
        {
            var s:Sound = new Sound(new URLRequest(e.target.path));
            s.play();
        }
    }
}

Итак, мы загружаем XML в наш класс документов. Мы перебираем xml length (); много раз, то есть сколько детей в объекте XML. Для каждого цикла или дочернего элемента мы создаем MovieClip, добавляем в него текстовое поле, маркируем текстовое поле, затем добавляем свойство «path» (xmlList [int]. @ Path) к содержащему мувиклипу со значением этого текущего Атрибут пути ребенка от XML. MouseEvent относится к мувиклипу, и мы сообщаем текстовому полю внутри, что он не получает ввод от мыши.

Я надеюсь, что это помогает, оборачивая текст в мувиклип, мы можем добавить к нему свойства, к которым может получить доступ метод события через цель, которая является s.

0 голосов
/ 16 декабря 2008

Я нашел решение своей проблемы!

Мое решение состояло в том, чтобы создать массив, который бы хранил все URL-адреса в trackNum, а затем создать имена экземпляров внутри моего цикла while. Затем я использовал event.target.name с подстрокой, чтобы обрезать текст и оставить только цифры. Работает потрясающе!

// xml variables
var xmlList:XMLList;
var trackLength:Number;
var trackURL;
var trackNum:Number = -1;
var tracksArray:Array = new Array();


// loads xml 
var xml:XML = new XML();
var loader:URLLoader = new URLLoader();
loader.load(new URLRequest(audioPlaylist));
loader.addEventListener(Event.COMPLETE, onComplete);

function onComplete(evt:Event):void {
        xml = XML(evt.target.data);
        xmlList = xml.children();
        trace(xmlList);
        trackLength = xmlList.children().children().length();

        while (trackNum < trackLength) {
            trackNum = trackNum + 1;

            var track:Playlist_item = new Playlist_item();
            track.y = trackNum * 28;
            playlist_container.addChild(track);
            track.name = "track" + [trackNum];

            trace(track);

            track.buttonMode = true;
            track.mouseChildren=false;

            track.playlist_text.text = xmlList.children().track[trackNum].toString();
            //trackURL = xmlList.children().track[trackNum].@rel.toString();

            tracksArray[trackNum] = xmlList.children().track[trackNum].@rel.toString();

            track.addEventListener(MouseEvent.MOUSE_OVER, onCarHover);
            track.addEventListener(MouseEvent.MOUSE_OUT, onCarOut);
            track.addEventListener(MouseEvent.CLICK, onClickLoadData);

        }   

}

function onCarHover(event:MouseEvent):void {
    event.target.gotoAndStop(6);
}

function onCarOut(event:MouseEvent):void {
    event.target.gotoAndStop(10);
}

function onClickLoadData(event:MouseEvent):void {

    //trace(tracksArray[5]);

    trace(event.target.name.substr(5));

    ns.play(tracksArray[event.target.name.substr(5)]);
}
...