Dans Flex / AS3, comment obtenir une définition de classe d'un actif incorporé avec getDefinitionByName
-
01-07-2019 - |
Question
J'ai une classe avec de nombreux actifs incorporés.
Dans la classe, j'aimerais connaître la définition de classe d'un actif par son nom. J'ai essayé d'utiliser getDefinitionByName (), et aussi ApplicationDomain.currentDomain.getDefinition (), mais aucun des deux ne fonctionne.
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");
La solution
Cela ne répond pas à votre question, mais cela pourrait résoudre votre problème. Je pense que faire quelque chose comme ça devrait marcher:
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");
J'ai de la difficulté à me souvenir si la notation entre crochets fonctionne pour les classes scellées. Si ce n’est pas le cas, une solution simple consiste à marquer la classe comme dynamique.
Autres conseils
La raison pour laquelle votre méthode ne fonctionne pas est parce que "Image1Class". est un nom de variable et non le nom de classe actuel .
Vous pouvez obtenir le nom de la classe comme ceci
import flash.utils.getQualifiedClassName;
trace(getQualifiedClassName(Image1Class));
Ce qui, comme vous pouvez le constater, signifie que le nom de votre classe (celui qui doit être passé dans la fonction) est quelque chose comme MyClass_Image1Class
.
Vous n'avez pas besoin d'utiliser de méthodes fantaisistes getDefinitionByName (), il vous suffit de vous y référer de manière dynamique. Dans votre cas, remplacez la ligne "Echec" par:
var classDef:Class = MyClass[name] as Class;
Et cela devrait le faire.
Merci beaucoup! Je viens de passer près de 5 heures à essayer de faire en sorte que le POS getDefinitionByName fonctionne avec le getQualifiedClassName que j'étais prêt à lancer des trucs !! Mon code de travail final ressemble à ceci et obtient même le nom de la chaîne d'un tableau.
CreatureParam est un tableau de chaînes en 2 dimensions;
Le type est un entier envoyé à Flash par une balise HTML qui provient d'une base de données MYSQL via PHP.
Mark1_cb est une liste déroulante présente sur la scène et portant un nom d'instance. Sa sortie est aussi un entier.
Ainsi, ce code directement sous la classe importe la classe "BirdBodyColor_mc". à partir d'un fichier "ArtLibrary.swf" externe swf externe. BirdBodyColor_mc est un MovieClip créé à partir d'une image png. Notez que vous devez double-cliquer sur le MovieClip dans le fichier ArtLibrary.fla et insérer une seconde image clé. Movieclips a apparemment besoin de deux images ou Flash essaie de l'importer en tant qu'image-objet et provoque une disparité de type.
[Incorporer (source = "ArtLibrary.swf", symbole = "BirdBodyColor_mc")] var BirdBodyColor_mc: Class;
Normalement, je mettrais une instance de cette classe de movieclip sur la scène en utilisant ce code.
myMC: MovieClip = new BirdBodyColor_mc (); addChild (myMC);
var Définition: Class = this [" BirdBodyColor_mc "]] en tant que classe; var Mark1: MovieClip = new Definition ();
Mais je dois le faire en utilisant une valeur de chaîne recherchée dans mon tableau. Donc, voici le code pour cela.
var Définition: Class = this [CreatureParam [Type] [Mark1_cb + 2]] en tant que classe; var Mark1: MovieClip = new Definition ();