我正在将基于平铺的2D游戏迁移到C ++,因为我真的不是Java的粉丝(有些功能很好,但我不能习惯它)。我正在使用TMX平铺地图。这个问题涉及如何将对象定义转换为实际的游戏实体。在Java中,我使用反射来分配指定类型的对象(假设它是从基本游戏实体派生的)。
这很好用,但这个功能在C ++中不可用(我理解为什么,我不抱怨。我发现反射很乱,我在Java中使用它犹豫不决,哈哈)。我只是想知道翻译这些数据的最佳方法是什么。我的想法是一个基类,所有实体都可以从中派生出来(这看起来非常标准),然后让加载器根据TMX映射中的'type'值分配派生类型。我想过两种方法可以做到这一点。
虽然选项2看起来很不错,但我不喜欢为每种类型更改3段代码(定义实体类,定义分配函数,以及将函数添加到std :: map)。选项3听起来很棒,除了我脑海中的两件事:我害怕纯粹脚本驱动的实体的速度。另外,我知道在我的引擎中添加脚本本身就是一个很大的项目(添加所有辅助函数以便与库连接会很有趣)。
有谁知道更好的解决方案?也许不是更好,但只是更清洁。每个实体类型的代码编辑更少。
答案 0 :(得分:2)
如果您使用自行注册工厂,则可以减少解决方案2中的代码更改次数。缺点是实体知道这个工厂(自注册),并且该工厂必须是全局(例如单个)实例。如果你没问题,这个模式可以很好。每种新类型只需要编译一个新文件的链接。
您可以像这样实施自我注册:
// foo.cpp
namespace
{
bool dummy = FactoryInstance().Register("FooKey", FooCreator);
}
Abstract Factory, Template Style, by Jim Hyslop and Herb Sutter