实体编辑器 - 如何动态生成组件列表?

时间:2012-04-15 04:12:01

标签: actionscript-3 reflection dynamic entity metadata

我正在制作一款游戏,而我是一款能够动态创建实体的游戏编辑器(而不是硬编码)。我正在使用组件聚合模型,所以我的实体只是一个组件列表。

获取或生成组件列表的最佳方法是什么?我真的不想手动为一些巨大的registerAllComponents()方法中的所有可能组件添加条目。

我想通过所有组件从基础Component类继承的知识,或者可能通过自定义元标记以某种方式反思,但是我还没有找到方法来获取从a派生的所有类的列表具有自定义元标记的类或所有类。

我还有哪些选择?

感谢。

2 个答案:

答案 0 :(得分:0)

不幸的是,目前没有正确的方法可以在Flash API中获取所有已加载的类或类似内容。因此,查找Component的所有子类已经完成,检查特定元标记的所有类也是不合适的。

前一段时间我遇到了一个类/函数,它在加载时检查了SWF自己的字节码,以检索所有包含的类。这是这种事情的唯一选择。请参阅this link和帖子的底部。

因此,你必须指定一个可供选择的组件类列表。

我想到的一个过于复杂/不可行的选项是创建一个外部工具来搜索源文件夹,解析AS3代码并确定Component的所有子类,最后生成一些XML列表文件。但对于胆小的人来说,这不是一项任务......

您自己可能会想到一堆手动解决方案,但一种方法是在某处保持可访问的ArrayVector.<Class>,例如:

public static const COMPONENT_LIST:Vector.<Class> = Vector.<Class>( [
    CollisionComponent,
    VisualComponent,
    StatsComponent,
    ...
    ...
] );

例如,保留String名称列表的一个优点是可以保证组件类被编译到SWF中。

如果未在代码中的任何其他位置显式引用类,则不会编译它们。对于一个每帧只update()一次的简单组件,可能会出现这种情况,并且仅由某个XML文件中的字符串指定。

澄清:您可以使用上面链接中的代码获取所有已加载类的名称列表,然后对每个类使用getDefinitionByName(className),然后调用到describeType(classObj)获取每种类型的XML描述。然后,解析类型的超类型,您可以确定它是否扩展Component我个人只会硬编码列表;在启动时检查所有加载的类对我来说太麻烦了,但这取决于你。

答案 1 :(得分:0)

对于我曾经做过的项目,我们使用ruby脚本生成一个AS文件,其中包含对某个包中所有类的引用(确保它们包含在编译中)。考虑到flash只允许与其所在文件同名的类,这非常容易,因此不需要解析实际代码。

同样可以在字典(或类似的东西)中添加一个条目,供工厂类稍后使用。

我相信在编译之前可以执行程序(至少在flashdevelop中),所以它不会添加任何手动工作。

编辑:我添加了一个基本的FlashDevelop项目来演示。它要求你安装ruby。 http://dl.dropbox.com/u/340238/share/AutoGen.zip