游戏实体类型分配

时间:2012-05-13 02:22:47

标签: c++ entity tmx

我正在将基于平铺的2D游戏迁移到C ++,因为我真的不是Java的粉丝(有些功能很好,但我不能习惯它)。我正在使用TMX平铺地图。这个问题涉及如何将对象定义转换为实际的游戏实体。在Java中,我使用反射来分配指定类型的对象(假设它是从基本游戏实体派生的)。

这很好用,但这个功能在C ++中不可用(我理解为什么,我不抱怨。我发现反射很乱,我在Java中使用它犹豫不决,哈哈)。我只是想知道翻译这些数据的最佳方法是什么。我的想法是一个基类,所有实体都可以从中派生出来(这看起来非常标准),然后让加载器根据TMX映射中的'type'值分配派生类型。我想过两种方法可以做到这一点。

  1. 一个巨大的开关盒块。冗长而恶心。我很怀疑有人会这么说(但很明显)。
  2. 使用std :: map,它会将任意类型名称映射到一个函数,以分配与所述类型名称对应的所述类。
  3. 最后,我曾想过制作一个基类的实体,并为不同的实体类型使用脚本。脚本本身会在系统中注册它们的实体类型,尽管游戏需要在加载时加载所述实体类型脚本(这可以通过一个主实体类型声明脚本完成,这将使每个实体的编辑数减少到2 :实体创建和实体注册)。
  4. 虽然选项2看起来很不错,但我不喜欢为每种类型更改3段代码(定义实体类,定义分配函数,以及将函数添加到std :: map)。选项3听起来很棒,除了我脑海中的两件事:我害怕纯粹脚本驱动的实体的速度。另外,我知道在我的引擎中添加脚本本身就是一个很大的项目(添加所有辅助函数以便与库连接会很有趣)。

    有谁知道更好的解决方案?也许不是更好,但只是更清洁。每个实体类型的代码编辑更少。

1 个答案:

答案 0 :(得分:2)

如果您使用自行注册工厂,则可以减少解决方案2中的代码更改次数。缺点是实体知道这个工厂(自注册),并且该工厂必须是全局(例如单个)实例。如果你没问题,这个模式可以很好。每种新类型只需要编译一个新文件的链接。

您可以像这样实施自我注册:

// foo.cpp
namespace 
{ 
  bool dummy = FactoryInstance().Register("FooKey", FooCreator); 
}

Abstract Factory, Template Style, by Jim Hyslop and Herb Sutter