我现在已经解决了这个问题,但我宁愿知道是否有正确的方法来做到这一点。我有一个函数可以生成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文件。
答案 0 :(得分:2)
你必须使用'hack'。
getDefinitionByName()
只能用于运行时存在的类。不幸的是,如果你不使用类,它将不会被编译,也不会在运行时存在。
图书馆符号使得解决这个问题变得更容易。如果您选中在给定框架中自动提供这些框的框,则可以确保在该框架期间或之后完成getDefinitionByName()
次呼叫。
答案 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()
可以访问这些切片。