5

我有一门包含许多嵌入式资产的课程。

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

4 回答 4

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

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

于 2008-09-17T20:57:33.703 回答
3

您的方法不起作用的原因是因为 "Image1Class" 是一个变量名,而不是实际的Class name

你可以像这样得到类名

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

如您所见,这意味着您的类名(应该传递给函数的类名)类似于MyClass_Image1Class.

于 2011-04-28T13:06:31.640 回答
2

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

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

那应该这样做。

于 2008-09-17T21:01:37.047 回答
0

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

CreatureParam 是一个二维字符串数组;

类型是一个整数,由 HTML 标记发送到 flash,而 HTML 标记又通过 PHP 来自 MYSQL 数据库。

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

因此,下面的代码直接从外部 swf“ArtLibrary.swf”导入类“BirdBodyColor_mc”。BirdBodyColor_mc 是从 png 图像创建的影片剪辑。请注意,您必须双击 ArtLibrary.fla 中的影片剪辑并插入第二个关键帧。影片剪辑显然需要两帧,否则闪存会尝试将其作为精灵导入并导致类型不匹配。

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

通常我会使用这段代码将这个movieclip 类的一个实例放到舞台上。

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

var 定义:Class = this["BirdBodyColor_mc"] as Class; var Mark1:MovieClip = new Definition();

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

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

于 2009-06-21T04:22:40.430 回答