2010-02-05 9 views
7

Gibt es eine Möglichkeit, auf eine Liste aller Objekte zuzugreifen, die von der Flash IDE in ActionScript exportiert wurden? Ich versuche, mir ein paar Probleme zu ersparen, indem ich nur ausgewählte MCs durchblättere und sie auf eine bestimmte Art und Weise verarbeite, ohne ihre Namen zu kennen.Flash AS3 - Eine Liste von Bibliotheksobjekten erhalten?

Danke.

Antwort

0

Ich hatte ein ähnliches Problem und wäre an einer Lösung interessiert, wenn es eine bessere gibt. Was ich jedoch getan habe, war, den Konstruktor jedes Elements zu veranlassen, die Dokumentklasse zu finden (indem ich this.parent aufruft, bis es eine gefunden hat, die von der richtigen Klasse war) und dann eine Funktion dieser Dokumentklasse aufruft.

Ich habe versucht, das Spiel Informationen über Standorte, die ich über die IDE platziert.

Also gab ich Ort einen Konstruktor wie folgt aus:

public function Location(){ 
    var d:DisplayObject = parent; 
    while(!(d is Game)){ 
     d = d.parent 
    } 

    d.addLocation(this); 
} 

Dann in der Spielklasse konnte ich sie zu einem Array hinzuzufügen und durch sie durchlaufen. Ich bin sicher, das kann nicht der beste Weg sein, aber es hat funktioniert.

+0

Sie jeden MC in einen Behälter hinzufügen und dann durch, dass für Orte und Sachen durchlaufen. Hatte gehofft, diesen mittleren Schritt zu vermeiden. – Scott

0

Grundsätzlich Nein ... Wenn Sie in der Bibliothek zu ActionScript exportieren, wird daraus eine Klasse. Genau wie andere Klassen - MovieClip, Loader ... etc. Dies sind alles Kompilierzeiteigenschaften. Im Grunde gibt es keine Möglichkeit, diese Klassen während der Laufzeit herauszufinden.

Aber Sie erwähnten Iteration durch MCs und tun etwas zu ihnen. Wenn Sie etwas mit dem MCs tun müssen bereits auf der Bühne auf ihre Klasse abhängig, können Sie tun dies mit dem folgenden:

for (var i=0; i<this.numChildren; i++){ 
    trace("Movie Name: "+this.getChildAt(i).name); 
    trace("Movie Class: "+getQualifiedClassName(this.getChildAt(i))); 
} 

Unter Verwendung der obigen Schleife und getQualifiedClassName kann eine alternative Lösung sein.

1

Nicht zur Laufzeit, nein. Sie können jedoch Bibliotheksobjekte mit JSFL in der IDE bearbeiten: http://livedocs.adobe.com/flash/9.0/main/flash_cs3_extending.pdf. Nicht sicher, ob das überhaupt hilft, aber vielleicht können Sie Code für die Verwendung in Ihrer Anwendung generieren, indem Sie die Bibliothek in irgendeiner Weise analysieren.

var lib = fl.getDocumentDOM().library; 
for (var i = 0; i < lib.items.length; i++) 
{ 
    var item = lib[0]; 
    fl.trace(item.name + " " + item.getItemType()); 
} 

Vielleicht einige Code generieren auf Basis von Bibliotheksobjekten getItemProperty() oder getItemType().

Abgesehen davon denke ich, dass deine beste Wette ist, wie die anderen sagten. Erstelle einen Dummy-MovieClip, der jedes Element enthält und es von der Bühne entfernt. Fügen Sie einen Listener für "add to stage" hinzu und durchlaufen Sie seine untergeordneten Elemente und verwenden Sie "reflection" getQualifiedClassName, um Aktionen basierend auf der Klasse auszuführen oder verwenden Sie einfach einen Instanznamen und eine switch-Anweisung.

Schließlich, was ist es genau, dass Sie auf jedem dieser MovieClips "verarbeiten"? Vielleicht ist es eher ein Design-Problem, und alle sollten eine gemeinsame MovieClip-Unterklasse erweitern, der ein "Add-to-stage" -Handler hinzugefügt wurde, wo Sie den MovieClip-Typ betrachten, wie er Ihrer Anwendung hinzugefügt wird, und einige Aktionen in diesem single ausführen Funktion. Ich arbeite gerade an einigen Lokalisierungsarbeiten bei der Arbeit und so verarbeiten wir mehrere verschiedene Clips zur Laufzeit.

1

Diese Frage ist ähnlich wie this one.

Dies ist die JSFL müssen Sie die nur die Movieclips aufzulisten, die in Actionscript exportiert werden:

var doc = fl.getDocumentDOM(); 
var libItems = doc.library.items; 
var libItemsNum = libItems.length; 
var classesString = 'var '+doc.name.substr(0,doc.name.length-4)+'Classes = ['; 
var classesNum = 0; 
var classes = []; 

fl.outputPanel.clear(); 
for(var i = 0 ; i < libItemsNum; i++){ 
if(libItems[i].linkageExportForAS){ 
    classes[classesNum] = libItems[i].linkageClassName; 
    classesNum++; 
} 
} 
for(i = 0; i < classesNum; i++){ 
if(i < classesNum-1) classesString += '"'+classes[i]+'",'; 
else  classesString += '"'+classes[i]+'"];'; 
} 
fl.clipCopyString(classesString); 
fl.trace(classesString); 

sie den Namen der exportierten Klassen Spuren aus als ein Array von Strings, so dass Sie mit der in verwenden ApplicationDomain's getDefinitionByName() oder flash.utils.getDefinition(). Außerdem kopiert es die verfolgte Nachricht in die Zwischenablage. Wenn Sie das JSFL im Ordner Commands speichern, können Sie eine Tastenkombination für ein bisschen Geschwindigkeit festlegen.

HTH, George