0

我正在制作一个游戏,并且我是一个游戏内编辑器,它能够即时创建实体(而不是硬编码它们)。我使用的是组件聚合模型,所以我的实体只不过是一个组件列表。

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

我在想可能以某种方式通过所有组件从基 Component 类继承的知识,或者可能通过自定义元标记进行反射,但我无法找到方法来获取从一个类或所有派生的所有类的列表具有自定义元标记的类。

我还有哪些选择?

谢谢。

4

2 回答 2

0

不幸的是,目前还没有适当的方法在 Flash API 中获取所有加载的类或类似的东西。因此,查找所有子类Component已经过时,检查所有类以查找特定元标记也已过时。

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

因此,您必须指定要从中选择的组件类列表。

想到的一个过于复杂/不可行的选择是创建一个外部工具来搜索您的源文件夹、解析 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 描述。然后,将其解析为类型的超类型,您可以确定它是否为 extends Component我个人只会硬编码一个列表。在启动时检查所有加载的类对我来说感觉太乱了,但这取决于你。

于 2012-04-15T04:25:54.277 回答
0

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

将条目添加到字典(或类似的东西)以供以后使用的工厂类也是微不足道的。

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

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

于 2012-04-15T07:30:47.987 回答