2008-12-15 5 views
1

Je charge le XML dans, et je suis capable de lire les nœuds XML dans des champs de texte dans mon flash. Il charge également l'URL, mais le dernier de la boucle. Il ne charge pas celui sur lequel je clique. J'ai essayé d'utiliser event.target, mais cela ne fonctionne pas. Je suis assez proche de comprendre, je ne suis pas sûr de savoir où chercher.Comment puis-je transmettre une URL dynamique à partir de XML dans un événement onClick Mouse dans ActionScript 3?

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

Je me rapproche, je réussi à créer un tableau, avec une valeur d'index - maintenant je peux choisir différentes URL à partir du tableau à jouer, mais je ne suis toujours pas sûr comment cibler celui sur lequel je clique directement et qui joue.

Voici mon code mis à jour:

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

Répondre

1

Il me semble que vous avez fait ce difficile sur vous-même. Je peux être incorrect car il est difficile de traverser le code que vous avez présenté. Le concept d'une playlist XML et en cliquant sur un objet d'affichage pour jouer des sons est assez facile et je vais démontrer.

Le 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> 

Le code 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][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(); 
     } 
    } 
} 

Nous charger le XML dans notre classe de document. Nous parcourons la longueur xml(); plusieurs fois, ce qui correspond au nombre d'enfants dans l'objet XML. Pour chaque boucle, ou enfant, nous créons un MovieClip, y ajoutons un champ de texte, étiquetons le champ de texte, puis ajoutons une propriété de "path" (xmlList [int]. @ Path) au movieclip contenant, avec une valeur de ce courant l'attribut de chemin d'accès childs à partir du fichier xml. Le MouseEvent est considéré pour le MovieClip et nous disons au champ de texte à l'intérieur de ne pas recevoir d'entrée de la souris.

J'espère que cette aide, envelopper le texte dans un MovieClip nous pouvons ajouter des propriétés à ce qui peut être consulté par la méthode d'événement à travers la cible qui est s.

0

J'ai trouvé une solution à mon problème!

Ma solution était de créer un tableau qui stockait toutes les URL par trackNum, puis de créer des noms d'instance dans ma boucle while. Ensuite, j'ai utilisé event.target.name avec la sous-chaîne pour couper le texte et me laisser avec juste les chiffres. Cela fonctionne génial!

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