2012-04-15 38 views
0

我正在制作一款游戏,而且我是一名游戏内编辑,能够即时创建实体(而不是硬编码它们)。我正在使用组件聚合模型,所以我的实体只是一个组件列表。实体编辑器 - 如何动态生成组件列表?

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

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

我还有什么样的选择?

谢谢。

回答

0

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

为了让以后使用的工厂类能够为词典(或类似的东西)添加一个条目也是微不足道的。

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

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

+0

这看起来像是Torious想法的自动化版本,非常完美。谢谢!我将不得不考虑如何让FlashDevelop在编译之前运行它。 – Bruce 2012-04-15 17:59:00

+0

您可以在项目属性 - >编译 - >预生成命令行下找到它。它在我的示例项目中也是如此:) – 2012-04-15 18:16:53

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我个人只会硬编码一个列表,我觉得在启动时检查所有已加载的类都太麻烦了,但这取决于你。

+0

感谢您的帮助。我只是因为它是你的建议的自动化版本而与Jonatan的答案一起去的。不过谢谢。 – Bruce 2012-04-15 17:59:24