2008-09-17 28 views
5

J'ai une classe avec de nombreux actifs incorporés. Dans la classe, j'aimerais obtenir la définition de classe d'un actif par son nom. J'ai essayé using getDefinitionByName(), et aussi ApplicationDomain.currentDomain.getDefinition() mais aucun travail.Dans Flex/AS3, comment obtenir une définition de classe d'un actif incorporé avec getDefinitionByName

Exemple:

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"); 

Répondre

8

Cela ne répond pas à votre question, mais il peut résoudre votre problème. Je crois faire quelque chose comme cela devrait fonctionner:

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"); 

Je suis un moment difficile se rappeler si la notation de support fonctionne sur les classes scellées. Si ce n'est pas le cas, une solution simple consiste à marquer la classe comme dynamique.

+0

Hey! Beau travail, ça a marché! – user8399

2

Vous n'avez pas besoin d'utiliser des méthodes fantaisie getDefinitionByName(), il suffit de s'y référer dynamiquement. Dans votre cas, remplacez la ligne «Échec» par:

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

Et cela devrait le faire.

+0

cela fonctionne! merci davr – jedierikb

0

Merci beaucoup! Je viens de passer presque 5 heures à essayer de faire fonctionner le POS getDefinitionByName avec le getQualifiedClassName que j'étais prêt à lancer !! Mon code de travail final ressemble à ceci et obtient même le nom de chaîne d'un tableau. CreatureParam est un tableau de 2 dimensions de chaînes;

Le type est un entier qui est envoyé au flash par une balise HTML qui vient d'une base de données MYSQL via PHP.

Mark1_cb est une liste déroulante qui est sur la scène et a un nom d'occurrence. Sa sortie est également un entier. Donc, ce code directement ci-dessous importe la classe "BirdBodyColor_mc" à partir d'un swf externe "ArtLibrary.swf". BirdBodyColor_mc est un MovieClip créé à partir d'une image PNG. Notez que vous devez double-cliquer sur le MovieClip dans ArtLibrary.fla et insérer une seconde image clé. Il semble que Movieclips ait besoin de deux images ou que Flash essaye de l'importer en tant que sprite et provoque une différence de type. [Insérer (source = "ArtLibrary.swf", symbole = "BirdBodyColor_mc")] var BirdBodyColor_mc: Classe;

Normalement, je voudrais mettre une instance de cette classe MovieClip sur la scène en utilisant ce code.

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

var Définition: Class = this ["BirdBodyColor_mc"] comme Classe; var Mark1: MovieClip = nouvelle définition();

Mais je dois le faire en utilisant une valeur de chaîne recherchée dans mon tableau. Alors voici le code pour ça.

var Définition: Classe = this [CreatureParam [Type] [Mark1_cb + 2]] comme Classe; var Mark1: MovieClip = nouvelle définition();

3

La raison pour laquelle votre méthode ne fonctionne pas est parce que « Image1Class » est un nom de variable , pas le nom réelle de classe.

Vous pouvez obtenir est quelque chose comme MyClass_Image1Class le nom de classe comme celui-ci

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

qui, comme vous pouvez le voir, signifie que votre nom de classe (celui qui devrait être passé dans la fonction).

+0

Mais, je recommanderais encore l'une des méthodes ci-dessus, car 'getDefinitionByName()' ne serait nécessaire que si vous accédez à ces images _outside_ de votre classe actuelle. – IQAndreas