2009-08-12 9 views
0

Ich muss mit eine Reihe von Bildern laden von XML und weisen Inter ihnenAS3 zuordnen Klasse XML Loaded Element

erste lade ich die XML-

import flash.display.Loader; 
import flash.net.URLRequest; 
    var loader:Loader  = new URLLoader(); 
    var request:URLRequest = new URLRequest("myXML.xml"); 
    loader.load(request); 

loader.addEventListener(Event.Complete, proessFile); 
function processFile(e:Event):void 
{ 
var loadedXML:XML = (e.target.data); 
} 

//load set of images from XML file 

for (var i:uint = 0; i < loadedXML.image.length(); i++) 
{ 
    var imgLoader:Loader  = new Loader(); 
    var imgRequest:URLRequest = new URLRequest (loadedXML.img[i].attribute("filepath")); 
    imgLoader.load(imgRequest); 
    addChild(imgLoader); 
} 

hier ich jedes einzelne Bild machen müssen ziehbar. Ist es möglich, es in einen anderen Datentyp zu ändern, b/c Ich kann nicht mit Loader arbeiten?

Ich habe versucht, ihnen .name Eigenschaft zuweisen, aber ich konnte sie später nicht aufrufen.

Ich weiß es nicht Wenn ich klar genug bin, aber im Grunde muss ich mit jedem einzelnen geladenen Bild als neues Objekt arbeiten. Ist es möglich jedem Bild eine Variable zuzuordnen?

Jeder Vorschlag für den Workflow hier würde sehr geschätzt werden.

Antwort

2

Da Sie sie zur Bühne hinzufügen, können Sie versuchen, sie zu benennen und sie dann über die Methode getChildByName der Bühne aufzurufen.

Oder Sie könnten ein Array von Loadern oder, besser noch, MovieClips erstellen. Etwas wie: import flash.display.Loader; import flash.net.URLRequest;

var loader:Loader  = new URLLoader(); 
var request:URLRequest = new URLRequest("myXML.xml"); 
loader.load(request); 

var images:Array = new Array(); 

loader.addEventListener(Event.Complete, proessFile); 
function processFile(e:Event):void 
{ 
var loadedXML:XML = (e.target.data); 
} 

//load set of images from XML file 

for (var i:uint = 0; i < loadedXML.image.length(); i++) 
{ 
    // create a new movie clip 
    var tmpMovieClip:MovieClip = new MovieClip(); 
    var imgLoader:Loader  = new Loader(); 
    var imgRequest:URLRequest = new URLRequest (loadedXML.img[i].attribute("filepath")); 
    imgLoader.load(imgRequest); 
    // add the loader to the movie clip's display list 
    tmpMovieClip.addChild(imgLoader); 
    // add the movieclip to the previously declared array 
    images.push(tmpMovieClip); 
} 

Auf diese Weise können Sie jedes Element des Arrays aufrufen und verwenden, wenn Sie sie benötigen. Wenn Sie die MoviClips nicht benötigen, können Sie einfach die Loader-Instanzen in das Array einfügen.

+0

danke für Hilfe. Ich habe Objekte in Sprite platziert und greife auf sie mit einem Array zu. –

1

Ich habe Angst, ich habe Probleme, einige Ihrer Fragen zu verstehen.

Kann ich es in einen anderen Datentyp ändern, b/c Ich kann nicht mit Loader arbeiten?

Zunächst, welchen Datentyp möchten Sie ändern? Zweitens, warum können Sie nicht mit Loader arbeiten?

Ich habe versucht, ihnen .name Eigenschaft zuweisen, aber ich konnte sie später nicht aufrufen.

Warum wollten Sie sie anrufen und wie haben Sie es versucht?

Ich muss mit jedem einzelnen geladenen Bild als neues Objekt arbeiten.

Jedes Loader-Objekt kapselt ein einzelnes Bildobjekt ein. Das Bild befindet sich tatsächlich im Loader (auf der .content-Eigenschaft).

evlepenguin beschreibt, wie Sie Verweise auf die Loader-Objekte in einem Array speichern können, um später darauf zugreifen zu können. Das ist der richtige Grundansatz. Die eigentliche Frage ist: "Was genau versuchst du zu tun?"

Sie sagen:

hier muss ich ziehbar jedes einzelne Bild machen.

Wenn es so einfach ist, fügen Sie Ereignisse direkt zum Loader hinzu (der das Bild kapselt).

for each(var image:XML in loadedXML.image) 
{ 
    var imgLoader:Loader = new Loader(); 
    var imgRequest:URLRequest = new URLRequest([email protected]); 
    imgLoader.load(imgRequest); 
    addChild(imgLoader); 

    // NOTE: you may want to wait until it is done loading 
    // before you add drag and drop behaviour although 
    // that isn't strictly necessary 
    makeDraggable(imgLoader); 
} 


function makeDraggable(loader:Loader):void 
{ 
    loader.addEventListener(MouseEvent.MOUSE_DOWN, startDrag); 
    loader.addEventListener(MouseEvent.MOUSE_UP, stopDrag); 

    // NOTE: I'll leave it up to you to decide 
    // how you want to implement drag and drop 
} 

Anmerkung: Ich habe mich verändert auch deine Schleife E4X zu verwenden, die mit XML Umgang in Actionscript einen viel schönen Weg ist.

+0

Das Hinzufügen von Ereignissen zum Loader ist theoretisch effizienter, stellt aber ein Usability-Problem dar: Die Loader-Klasse verfügt nicht über die Eigenschaft .buttonMode. Daher ändert sie nicht den Mauszeiger bei Hover. Das bedeutet, dass der Benutzer nicht unbedingt erkennt, dass Mausaktionen auf dem Objekt ausgeführt werden. Wenn die Leistung keine absolute Sorge ist, lege ich die Loader lieber in Filmclips an. Fehle ich etwas, gibt es einen anderen Weg, dies zu tun? – evilpenguin

+0

Auf Frage was genau versuche ich zu tun. Ich möchte eine Klasse erstellen, die die Funktionalität jedes geladenen Gegenstands erweitert. Ich möchte alle Interaktivität in diese Klasse legen. Einzelunterricht für alle Gegenstände. –

0

Um eine Kopie Ihrer Bilder zu erstellen, gehen Sie einfach wie folgt vor.

private function contentLoaderInfo_completeHandler(event:Event):void 
{ 
    var loaderInfo:LoaderInfo = event.target as LoaderInfo; 
    var originalBitmap:Bitmap = loaderInfo.content as Bitmap; 
    var newBitmap:Bitmap = new Bitmap(originalBitmap.bitmapData.clone()); 
    images.push(addChild(newBitmap)); 
} 

Auf diese Weise können vollständig aus dem Loader-Objekt abgelöst werden und vollständig von ihnen verfügen kann. Offensichtlich, wie evilpenguin vorgeschlagen hat, könntest du sie stattdessen zu Sprites oder MovieClips hinzufügen und dann diese zur Bühne hinzufügen (die Bitmap-Klasse ist kein DisplayObjectContainer und du kannst ihnen keine zusätzlichen Kinder hinzufügen).