在Flex / AS3中,如何使用getDefinitionByName获取嵌入式资产的类定义

时间:2008-09-17 20:52:54

标签: flex flash actionscript-3 actionscript embed

我有一个包含许多嵌入资源的课程。

在课堂上,我希望按名称获取资产的类定义。我尝试过使用getDefinitionByName()和ApplicationDomain.currentDomain.getDefinition(),但都没有工作。

示例:

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

4 个答案:

答案 0 :(得分:8)

这不能解答您的问题,但它可以解决您的问题。我相信做这样的事情应该有效:

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

我很难记住括号符号是否适用于密封类。如果没有,一个简单的解决方案是将类标记为动态。

答案 1 :(得分:3)

您的方法不起作用的原因是“Image1Class”是变量名称,而不是实际的类名

你可以像这样得到类名

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

您可能会看到,这意味着您的类名(应该传递给函数的类名)类似于MyClass_Image1Class

答案 2 :(得分:2)

您不需要使用任何花哨的getDefinitionByName()方法,只需动态引用它。在您的情况下,将'Fails'行替换为:

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

那应该这样做。

答案 3 :(得分:0)

非常感谢你!我花了差不多5个小时试图让POS getDefinitionByName与我准备扔东西的getQualifiedClassName一起工作!!我的最终工作代码看起来像这样,甚至从数组中获取字符串名称。

CreatureParam是一个2维的字符串数组;

Type是一个整数,通过HTML标记发送到flash,该标记通过PHP转换为MYSQL数据库。

Mark1_cb是舞台上的组合框,具有实例名称。它的输出也是一个整数。

所以这个代码直接在下面从外部swf“ArtLibrary.swf”导入类“BirdBodyColor_mc”。 BirdBodyColor_mc是从png图像创建的动画片段。请注意,您必须双击ArtLibrary.fla中的动画片段并插入第二个关键帧。 Movieclips显然需要两个帧或flash尝试将其作为精灵导入并导致类型不匹配。

[Embed(source =“ArtLibrary.swf”,symbol =“BirdBodyColor_mc”)] var BirdBodyColor_mc:Class;

通常我会使用此代码在舞台上放置此movieclip类的实例。

myMC:MovieClip = new BirdBodyColor_mc(); 的addChild(myMC);

var定义:Class = this [“BirdBodyColor_mc”]作为Class; var Mark1:MovieClip = new Definition();

但我需要使用在我的数组中查找的字符串值来执行此操作。所以这是代码。

var定义:Class = this [CreatureParam [Type] [Mark1_cb + 2]]为Class; var Mark1:MovieClip = new Definition();