【问题标题】:In Flex/AS3, how do I get a class definition of an embedded asset with getDefinitionByName在 Flex/AS3 中,如何使用 getDefinitionByName 获取嵌入式资产的类定义
【发布时间】:2010-09-10 09:29:09
【问题描述】:

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

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

【问题讨论】:

    标签: apache-flex flash actionscript-3 actionscript embed


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      可以这样获取类名

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

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

      【讨论】:

      • 但是,我仍然会推荐上述方法之一,因为只有在您访问当前班级外部的这些图像时,getDefinitionByName() 才需要。
      【解决方案3】:

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

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

      应该这样做。

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2010-12-18
          • 2015-06-16
          • 2011-05-22
          • 2011-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多