getDefinitionByName找不到存在的变量

时间:2012-04-29 16:59:57

标签: actionscript-3

我正在使用 flash.utils.getDefinitionByName 试图获取艺术资产。我使用这个功能相当多,直到现在还没有遇到麻烦。检查一下:

assetName = Assets.MegaBerry; // works
assetName = getDefinitionByName("Assets.MegaBerry") as Class; // doesn't work

到底是什么?第二行的错误响应是" 找不到变量。"

如果重要:资产是我的根源目录中的文件(它没有包;资产是完全限定的名称),我已尝试过:

import Assets;

在顶部没有运气。

作为参考,在Assets.as中我有:

    [Embed(source = "../art/Inventory/MegaBerry.png")]
    public static var MegaBerry:Class;

5 个答案:

答案 0 :(得分:3)

您的问题是将资源嵌入Assets类将创建属于该类的Class类型的静态变量 - 这是您在使用Assets.MegaBerry时引用的内容:Class类型的变量(!)。

但是,它不会将MegaBerry类注册到完全限定的类名称。要做到这一点,你必须在应用程序的某个时刻使用 - 谁会猜到 - registerClassAlias

registerClassAlias("Assets.MegaBerry", Assets.MegaBerry);

之后,在调用getDefinitionByName时,其他地方都可以使用。

** 编辑 **

这是一些意想不到的行为......事实证明,嵌入的类实际上已自动注册,但在{className}_{variableName}下,而不是您期望的符号。所以使用:

getDefinitionByName("Assets_MegaBerry") as Class;

应该诀窍。

registerClassAlias也有效,但您需要拨打getClassByAlias而不是getDefinitionByName。抱歉混淆了。

** 结束编辑 **

您还可以使用Embed标记将资源注入单独的类文件中,然后可以使用getDefinitionByName按预期方式引用该文件,或者只使用导入:

package assets {

    [Embed(source="../art/Inventory/MegaBerry.png"]
    public class MegaBerry extends BitmapData {
    }
}

答案 1 :(得分:1)

而不是打电话

assetName = getDefinitionByName("Assets.MegaBerry") as Class;

,而只是使用:

assetName = Assets["MegaBerry"];

答案 2 :(得分:0)

尝试:

 [Embed(source = "../art/Inventory/MegaBerry.png" , symbol="MegaBerry")]
 public static var MegaBerry:Class;

答案 3 :(得分:0)

在actionscript中,对象实际上有一个name属性,它与代码中显示的实际变量名不同。

例如,如果您按如下方式创建变量,

var myBerry = new MegaBerry();

然后getDefinitionByName("myBerry")将返回null。

只有在您通过编写myBerry.name = "myBerry"设置变量的名称时,getDefinitionByName("myBerry")才会返回您想要的内容。对象的名称不一定必须等于代码中的变量名。

在您的具体情况下,我认为您无论如何都不需要使用其中任何一种。你试过assetName = new MegaBerry()吗?

答案 4 :(得分:0)

如果您想了解该课程的完全限定名称,您可以执行以下操作:

trace(getQualifiedClassName(Assets.MegaBerry));

例如,您可以从Assets.as内部执行此操作。

您可以将该字符串反馈给getDefinitionByName()并获取对该类的引用。

trace(getDefinitionByName(getQualifiedClassName(SomeClass)));
// output [class SomeClass]

请记住,getDefinitionByName()只能获取与getDefinitionByName调用本身相同范围的类的引用。因此,如果要加载外部SWF,获取类引用将取决于您使用的应用程序域以及此代码执行的位置。