Arbeiten mit SWCs - getDefinitionByName Problem

8

Ich habe eine Menge Grafikelemente in einem Fla, die MovieClips sind mit einigen Klassen verknüpft. Ich exportiere das Fla als swc, das ich mit der Option "In Code zusammengeführt" zu meiner Bibliothek hinzufüge.

Alles funktioniert super, ich kann Instanzen meiner MovieClips erstellen, indem ich ihre Klassen einfach so aufruft.

%Vor%

Wenn ich nun Folgendes machen will, gibt Flash einen Fehler aus, GraphicsAssetClass ist null!

%Vor%

Der einzige Weg, wie ich die obige Zeile zur Arbeit bringen kann, ist dies zu tun

%Vor%

Können Sie sich eine Lösung vorstellen, bei der ich die Klasse einfach durch Aufruf von getDefinitionByName () erhalten könnte? wie ich bei Beispiel 2 mache, ohne auf Beispiel 3 zurückgreifen zu müssen.

    
PatrickS 05.11.2010, 04:42
quelle

2 Antworten

10

Das Problem ist, dass der Compiler alle Klassen ausschließt, auf die nicht direkt irgendwo in Ihrem Code verwiesen wird. Dies ist eine Optimierung, die der Compiler by design anwendet.

Der normale Weg dahin ist genau so, wie Sie es in Ihrem "Beispiel 3" gezeigt haben. Aber es ist wichtig zu beachten, dass die zwei Linien nicht am selben Ort zusammen sein müssen. Solange

%Vor%

befindet sich irgendwo in Ihrer SWF-Datei, auf die vom Hauptausführungspfad aus verwiesen wird, dann wird die Klassendefinition für GraphicAsset in die endgültige swf aufgenommen. Dann kannst du anrufen ...

%Vor%

von woanders ganz, und es wird funktionieren, wie Sie es erwarten.

Es ist sogar möglich (und ziemlich häufig), die zwei Zeilen in seaprate SWFs zu finden. In diesem Fall würde ein swf den anderen swf zur Laufzeit laden. In der Regel ist der loader swf derjenige, der getDefinitionByName("SomeClass) verwendet, und der geladene swf ist derjenige, der class SomeClass definiert und var a:SomeClass; verwendet, um sicherzustellen dass die Klasse in swf eingebaut wird.

Aus diesem Grund finden Sie häufig eine Klasse namens "MyLibraryManifest", die in einem "library swf" definiert ist und dann auf den Haupt-Movieclip dieses swf verweist. Die "manifest" -Klasse würde dann einfach so aussehen:

%Vor%

[edit] Sie können die Optionen -includes oder -include-libraries für den Compiler mxmlc verwenden, um zu erzwingen, dass der Linker eine oder mehrere einzelne Klassen (oder eine ganze swc) enthält, ohne die "Beschneidung-Optimierung" anzuwenden. Ich habe es oben beschrieben.

finden Sie auf der Adobe-Website zur Erläuterung des mxmlc-Befehls Zeilenoptionen.

Die Optionen können auch in einer Konfigurationsdatei angegeben werden, damit Sie sie steuern können wie flex und / oder die Flash IDE den Compiler hinter den Kulissen aufrufen wird.

viel Glück!

    
Lee 05.11.2010, 05:13
quelle
1

Mit FlashDevelop ist das ziemlich einfach zu beheben.

Klicken Sie mit der rechten Maustaste auf Ihr eingeschlossenes swc in der Projektliste. Wählen Sie Optionen und dann "Bibliothek einschließen (vollständige Bibliothek)".

.. Sie können jetzt getDefinitionByName verwenden, um eine nicht referenzierte Klasse aus Ihrer SWC-Datei zu erhalten.

    
Daniel 21.02.2012 08:13
quelle

Tags und Links