Actionscript 3 getDefinitionByName没有看到类

时间:2013-05-26 23:51:10

标签: actionscript-3 flashdevelop

我现在已经解决了这个问题,但我宁愿知道是否有正确的方法来做到这一点。我有一个函数可以生成MovieClip,这是一个地图的图块,然后我将它附加到舞台上。它根据字符串变量确定要使用哪个类别的tile,如下所示:

// symbolID holds our class name, determined by logic above
var newClass:Class = getDefinitionByName(symbolID) as Class;
var newtile:MovieClip = new newClass();

这可行,但如果该类的实例已存在于代码中的其他位置。它可以是任何地方 - 在文档类中,在辅助类的一些隐藏功能中,它似乎并不重要。如果没有,Flashdevelop抛出错误1065,“未定义变量(变量)”。我提到我正在使用Flashdevelop,因为它似乎可能是特定于编译器的,但我不确定。

我的修复方法是:

var a:baseTile;
a as anotherTile;
a as aThirdTile;

等等,这是有效的,但如果我最终会有数百个这样的tile类,那肯定是不理想的。

编辑:我应该补充一点,这些动画片段来自一个来自Flash Professional的.swc文件。

3 个答案:

答案 0 :(得分:2)

你必须使用'hack'。

getDefinitionByName()只能用于运行时存在的类。不幸的是,如果你不使用类,它将不会被编译,也不会在运行时存在。

图书馆符号使得解决这个问题变得更容易。如果您选中在给定框架中自动提供这些框的框,则可以确保在该框架期间或之后完成getDefinitionByName()次呼叫。

enter image description here

答案 1 :(得分:1)

虽然SWC库可以包含要包含在构建路径中的特定类,但Flash编译器不会将未引用的类链接到SWF;因此,需要一个链接库。

保留类的示例链接:

/** linkage library */
private static const classA:ClassA;
private static const classB:ClassB;
private static const classC:ClassC;

另一种选择是从RSL (Runtime Shared Library)加载类。

答案 2 :(得分:1)

基本上是的,您需要在代码中的某处严格引用该类。你甚至可以在其他地方提出“未引用”的引用。我有一百个像这样的类,我不得不在项目内的某个地方创建这些类的Array个。我把它放在调用getDefinitionByName()的函数旁边,以确保该函数中的类可用。

private static const dummy:Array=[Rock01, Rock02,...,Gem01,Gem02,...];

因此,您可以使用此类数据列出项目中的所有切片,并希望getDefinitionByName()可以访问这些切片。