我正在使用 flash.utils.getDefinitionByName 试图获取艺术 Assets 。我经常使用这个功能,直到现在还没有遇到问题。检查:

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

有没有搞错??第二行的错误响应是“未找到变量”。

如果重要:Assets 是我的根源目录中的一个文件(它没有包;Assets 是完全限定的名称),我尝试将:
import Assets;

在没有运气的情况下登顶。

作为引用,在 Assets.as 我有:
    [Embed(source = "../art/Inventory/MegaBerry.png")]
    public static var MegaBerry:Class;

最佳答案

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

但是,它不会将 MegaBerry 类注册为完全限定的类名。为此,您必须在应用程序中的某个时刻使用 - 谁会猜到 - registerClassAlias:

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

之后,在调用 getDefinitionByName 时,它​​将在其他任何地方可用。

** 编辑 **

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

应该诀窍。
registerClassAlias 也可以,但是你需要调用 getClassByAlias 而不是 getDefinitionByName 。抱歉搞混了。

** 结束编辑 **

您还可以使用 Embed 标记将资源注入(inject)到单独的类文件中,然后您可以使用 getDefinitionByName 或简单地使用导入按预期引用该文件:
package assets {

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

关于actionscript-3 - getDefinitionByName 未找到存在的变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10374031/

10-15 03:20