3

我正在使用flash.utils.getDefinitionByName试图获取艺术资产。我经常使用这个功能,直到现在都没有遇到过麻烦。核实:

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;
4

5 回答 5

3

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

但是,它不会将 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 {
    }
}
于 2012-04-29T17:39:00.743 回答
1

而不是打电话

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

, 而只是使用:

assetName = Assets["MegaBerry"];
于 2012-04-29T18:40:28.583 回答
0

尝试:

 [Embed(source = "../art/Inventory/MegaBerry.png" , symbol="MegaBerry")]
 public static var MegaBerry:Class;
于 2012-04-29T17:17:51.053 回答
0

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

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

var myBerry = new MegaBerry();

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

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

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

于 2012-04-29T19:22:11.807 回答
0

如果你想知道你的类的完全限定名是什么,你可以执行以下操作:

trace(getQualifiedClassName(Assets.MegaBerry));

例如,您可以在 Assets.as 中执行此操作。

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

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

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

于 2012-04-30T16:11:11.023 回答