1


3

ActionScript 3でXMLから動的URLをonClickマウスイベントに渡す方法を教えてください。

私は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][email protected]();

            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][email protected]();

            tracksArray[trackNum] = xmlList.children().track[trackNum][email protected]();

            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 Answer


1


あなたがこれを自分で苦労したように思えます。 あなたが提示したコードをたどるのは難しいので、私は間違っているかもしれません。 XMLプレイリストと表示オブジェクトをクリックしてサウンドを再生するという概念は非常に簡単で、これから説明します。

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][email protected];
                tf.y = i * 12 + 20; //Seperates the textfields by 12 px starting at y:20;
                s.path = _xmlList[i][email protected];
                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はMovieClipと見なされ、内部のテキストフィールドにマウス入力を受け取らないように指示します。

これが助けになることを願っています、MovieClipのテキストをラッピングすることで、sをターゲットとしてイベントメソッドからアクセスできるプロパティを追加することができます。


0


私は自分の問題に対する解決策を見つけました!

私の解決策はすべての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][email protected]();

            tracksArray[trackNum] = xmlList.children().track[trackNum][email protected]();

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