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

时间:2020-03-05 19:00:01  来源:igfitidea点击:

我有一堂课,里面有很多嵌入式资产。

在类中,我想按名称获取资产的类定义。我试过使用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");

解决方案

回答

这不能回答问题,但可以解决问题。我相信这样做是可行的:

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

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

回答

我们不需要使用任何精美的getDefinitionByName()方法,只需动态地引用它即可。根据情况,将" Fails"行替换为:

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

那应该做到的。

回答

太感谢了!我花了将近5个小时来尝试使POS getDefinitionByName与准备扔东西的getQualifiedClassName一起使用!我最终的工作代码如下所示,甚至从数组中获取字符串名称。

CreatureParam是2维的字符串数组;

Type是一个整数,它通过HTML标签发送到Flash,而HTML标签又是通过PHP来自MYSQL数据库的。

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

因此,下面的代码直接从外部swf" ArtLibrary.swf"导入类" BirdBodyColor_mc"。 BirdBodyColor_mc是从png图像创建的动画片段。请注意,我们必须双击ArtLibrary.fla中的动画片段并插入第二个关键帧。 Movieclips显然需要两帧,否则Flash会尝试将其导入为Sprite并导致类型不匹配。

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

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

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

var Definition:Class = this [" BirdBodyColor_mc"]作为Class;
var Mark1:MovieClip = new Definition();

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

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