How can I pass a dynamic url from XML to the OnClick Mouse event in ActionScript 3?

I am loading XML and I can read XML nodes in text fields during my flash. It also loads the url, but the last one from the loop. It doesn't load the one I click on. I tried to use event.target

but it doesn't work. I'm pretty close to figuring this out, I'm just not sure where to look.

// 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);
}

      


I'm getting closer, I was able to create an array with an index - I can now select different urls from the array to play, but I'm still not sure how to target the one I click directly and play.

Here is my updated code:

// 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]);
}

      

+1


source to share


2 answers


It seems to me that you did it on yourself. I may be wrong as it is difficult to go through the code you presented. The concept of an XML playlist and clicking on a display object to play sounds is pretty simple, as I'll demonstrate.

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 code



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();
        }
    }
}

      

So, we load XML into our document class. We iterate over the length of the xml (); many times, namely how many children are in the XML object. For each loop or child, we create a MovieClip, add a text box to it, mark the text box, and add a "path" property (xmlList [int]. @Path) to the containing movie clip with the value of this current childs path attribute from the xml. The MouseEvent is seen in the MovieClip and we are telling the text field inside to not receive mouse input.

I hope this helps, by wrapping the text in a MovieClip, we can add properties to it that the event method can access through the target, which is s.

+1


source


I found a solution to my problem!

My solution was to create an array that saved all the urls trackNum

and then create the instance names inside the while loop. I then used event.target.name

with a substring to cut off the text and leave me just numbers. It's amazing!



// 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)]);
}

      

0


source







All Articles