在 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 获取嵌入式资产的类定义的主要内容,如果未能解决你的问题,请参考以下文章