我正在使用 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;
答案 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,获取类引用将取决于您使用的应用程序域以及此代码执行的位置。