Actionscript 3 getDefinitionByName找不到存在的变量

Actionscript 3 getDefinitionByName找不到存在的变量,actionscript-3,Actionscript 3,我使用flash.utils.getDefinitionByName试图获取艺术资产。我经常使用这个函数,直到现在都没有遇到过问题。检查它: assetName = Assets.MegaBerry; // works assetName = getDefinitionByName("Assets.MegaBerry") as Class; // doesn't work 搞什么鬼??第二行的错误响应为“未找到变量” 如果重要的话:Assets是我根源目录中的一个文件(它没有包;Assets是

我使用flash.utils.getDefinitionByName试图获取艺术资产。我经常使用这个函数,直到现在都没有遇到过问题。检查它:

assetName = Assets.MegaBerry; // works
assetName = getDefinitionByName("Assets.MegaBerry") as Class; // doesn't work
搞什么鬼??第二行的错误响应为“未找到变量”

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

import Assets;
在顶端没有运气

作为参考,在资产中,如我所述:

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


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

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

registerClassAlias("Assets.MegaBerry", Assets.MegaBerry);
之后,当调用
getDefinitionByName
时,它将在其他任何地方都可用

**编辑**

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

getDefinitionByName("Assets_MegaBerry") as Class;
你应该去玩这个把戏

registerClassAlias
也可以工作,但是您需要调用
getClassByAlias
而不是
getDefinitionByName
。对不起,弄错了

**结束编辑**

您还可以使用嵌入标记将资源注入到单独的类文件中,然后可以使用
getDefinitionByName
或简单地使用导入来引用该类文件:

package assets {

    [Embed(source="../art/Inventory/MegaBerry.png"]
    public class MegaBerry extends BitmapData {
    }
}
而不是打电话

assetName = getDefinitionByName("Assets.MegaBerry") as Class;
,而只需使用:

assetName = Assets["MegaBerry"];

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

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

var myBerry = new MegaBerry();
然后
getDefinitionByName(“myBerry”)
将返回null

只有通过写入
myBerry.name=“myBerry”
设置变量名称时,
getDefinitionByName(“myBerry”)
才会返回所需的值。对象的名称不一定必须等于代码中的变量名称


在你的特殊情况下,我认为你无论如何都不需要使用这些。您是否尝试过
assetName=new MegaBerry()

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

trace(getQualifiedClassName(Assets.MegaBerry));
例如,您可以从内部资产中执行此操作

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

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

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

图像转码器不支持“symbol”,我的编译器是这样说的:/嗯,你说的有道理,但我不能让它发挥作用。在出错的assetName调用之前添加了registerClassAlias,但仍然表示找不到它:/虽然资产的单独文件起作用,但它有点笨拙。。。我将有数百张图片,并将它们保存在一个文件中,每一行代码,这绝对是更好的。我找到了一个解决方案并更正了我的答案。请参阅编辑。由于我对问题的简化,我猜这个问题有点误导,但字符串“MegaBerry”是按程序生成的(它可能是“MegaPie001”或“MegaBerry17”)。我不确定我是否理解这里发生了什么。当您应该创建几个MegaBerry类的实例时,为什么要创建这些类?在类上设置
name
属性对我来说没有任何作用,只是存储字符串……您尝试过“Assets::MegaBerry”吗?如果这不起作用,请调用getQualifiedClassName(Assets.MegaBerry)并检查其输出。getQualifiedClassName和getDefinitionByName是一对,因此一个的输出通常是另一个的输入。
trace(getDefinitionByName(getQualifiedClassName(SomeClass)));
// output [class SomeClass]