2008-09-17 4 views
5

Ich habe eine Klasse mit vielen eingebetteten Assets.In Flex/AS3, wie bekomme ich eine Klassendefinition eines eingebetteten Assets mit getDefinitionByName

Innerhalb der Klasse möchte ich die Klassendefinition eines Assets nach Name erhalten. Ich habe versucht, getDefinitionByName(), und auch ApplicationDomain.currentDomain.getDefinition(), aber beide funktionieren nicht.

Beispiel:

public class MyClass 
{ 
    [Embed(source="images/image1.png")] private static var Image1Class:Class; 
    [Embed(source="images/image2.png")] private static var Image2Class:Class; 
    [Embed(source="images/image3.png")] private static var Image3Class:Class; 

    private var _image:Bitmap; 

    public function MyClass(name:String) 
    { 
    var ClassDef:Class = getDefinitionByName(name) as Class; //<<-- Fails 
    _image = new ClassDef() as Bitmap;  
    } 
} 

var cls:MyClass = new MyClass("Image1Class"); 

Antwort

8

diese Antwort Ihre Frage nicht, aber es kann Ihr Problem lösen. Ich glaube, etwas zu tun, wie das funktionieren sollte:

public class MyClass 
{ 
    [Embed(source="images/image1.png")] private static var Image1Class:Class; 
    [Embed(source="images/image2.png")] private static var Image2Class:Class; 
    [Embed(source="images/image3.png")] private static var Image3Class:Class; 

    private var _image:Bitmap; 

    public function MyClass(name:String) 
    { 
    _image = new this[name]() as Bitmap;  
    } 
} 

var cls:MyClass = new MyClass("Image1Class"); 

Ich erinnere mich an eine harte Zeit, wenn Dirac-Notation auf versiegelten Klassen funktioniert. Wenn dies nicht der Fall ist, besteht eine einfache Lösung darin, die Klasse als dynamisch zu kennzeichnen.

+0

Hey! Netter Job, das hat funktioniert! – user8399

2

Sie müssen keine ausgefallenen getDefinitionByName() -Methoden verwenden, sondern einfach dynamisch darauf verweisen. In Ihrem Fall, ersetzen Sie die "Fails" Linie mit:

var classDef:Class = MyClass[name] as Class; 

Und das sollte es tun.

+0

das funktioniert! danke davr – jedierikb

0

Vielen Dank! Ich habe gerade fast 5 Stunden damit verbracht, den POS getDefinitionByName mit dem getQualifiedClassName zu arbeiten, mit dem ich fertig war, Sachen zu werfen !! Mein endgültiger Arbeitscode sieht so aus und erhält sogar den String-Namen von einem Array.

CreatureParam ist ein zweidimensionales Array von Strings;

Typ ist eine Ganzzahl, die per HTML-Tag an Flash gesendet wird, die ihrerseits aus einer MYSQL-Datenbank via PHP kommt.

Mark1_cb ist eine Combobox, die sich auf der Bühne befindet und einen Instanznamen hat. Es ist auch eine Ganzzahl.

Dieser Code direkt unter importiert die Klasse "BirdBodyColor_mc" von einem externen swf "ArtLibrary.swf". BirdBodyColor_mc ist ein Movieclip, der aus einem PNG-Bild erstellt wurde. Beachten Sie, dass Sie auf den MovieClip in der ArtLibrary.fla doppelklicken und einen zweiten Keyframe einfügen müssen. Movieclips benötigen anscheinend zwei Frames oder flash versucht, sie als Sprite zu importieren und führt zu einem Typenkonflikt.

[Einbetten (source = "ArtLibrary.swf", symbol = "BirdBodyColor_mc"]] var BirdBodyColor_mc: Klasse;

Normalerweise würde ich mit diesem Code eine Instanz dieser Movieclip-Klasse auf die Bühne legen.

myMC: MovieClip = neu BirdBodyColor_mc(); addChild (myMC);

var Definition: Klasse = dies ["BirdBodyColor_mc"] als Klasse; var Mark1: MovieClip = neue Definition();

Aber ich muss dies tun mit einem String-Wert in meinem Array nachgeschlagen. Also hier ist der Code dafür.

var Definition: Klasse = das [CreatureParam [Typ] [Mark1_cb + 2]] als Klasse; var Mark1: MovieClip = neue Definition();

3

Der Grund Ihrer Methode nicht der Fall funktioniert, weil „Image1Class“ ein Name Variable ist, nicht die tatsächliche Klassenname.

Sie können die Klassennamen wie diese

import flash.utils.getQualifiedClassName; 
trace(getQualifiedClassName(Image1Class)); 

erhalten, die, wie Sie, Ihre Klassennamen bedeutet, sehen können (die eine, die in die Funktion übergeben werden soll) sind so etwas wie MyClass_Image1Class.

+0

Aber ich würde immer noch eine der oben genannten Methoden empfehlen, da 'getDefinitionByName()' nur notwendig wäre, wenn Sie auf diese Bilder außerhalb Ihrer aktuellen Klasse zugreifen. – IQAndreas

Verwandte Themen