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

Posted

技术标签:

【中文标题】在 Flex/AS3 中,如何使用 getDefinitionByName 获取嵌入式资产的类定义【英文标题】:In Flex/AS3, how do I get a class definition of an embedded asset with 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");

【问题讨论】:

【参考方案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();

【讨论】:

以上是关于在 Flex/AS3 中,如何使用 getDefinitionByName 获取嵌入式资产的类定义的主要内容,如果未能解决你的问题,请参考以下文章

[flex] as3.0 实现基于air的简单浏览器

将应用程序从AS2迁移到AS3有哪些优缺点?

从 Flex 3 安全地访问 .NET Web 服务

在eclipse上调试flash时看不到变量

是否可以从命令行发布 FLA?

ActionScript 3 XMLSocket 的策略文件问题