用c ++创建数据驱动的结构?

时间:2014-01-05 14:32:31

标签: c++

我正在为游戏制作实体组件系统。 我使用成员变量将我的组件实现为结构:

struct Position
{
   float x;
   float y;
}

struct Render
{
   unsigned int texture;
}

这一切都很好,并且尽可能简单,如果我想添加一个新的组件类型,我将不得不创建一个新的结构并将其添加到代码中。

但这是一个问题: 我想让玩家在游戏编译完成后创建添加新组件类型的mod?

例如,假设modder提供了一个定义组件的文件,该文件包含如下内容:

position
float x
float y

我能做到的一种方法是让每个组件都有一个映射字符串(变量名)及其值的映射。我会有一个用于整数的地图,一个用于花车的地图,依此类推。然后组件看起来像这样:

struct Component
{
   string type;
   map<string, int> ints;
   map<string, float> floats;
}

然后游戏将读取定义组件的文件并将变量添加到地图中。 现在我的问题是:

  • 这是个好主意吗?
  • 由于我每帧访问这些变量,因为地图会使访问速度变慢吗?
  • 这个问题的最佳解决方案是什么?

编辑: 我应该指出,这些文件定义了全新的struct类型,因此不需要在代码中手动添加类似下面的内容:

struct Health
{
   float max_hp;
   float hp;
}

我会写一个包含以下内容的文件:

health
float max_hp
float hp

让游戏从中读取类定义。

1 个答案:

答案 0 :(得分:1)

您的对象可以具有一组原始属性和自定义属性。您的引擎必须依赖于原始属性的存在,并且通常不会访问自定义属性。例如,在mod中定义“position”属性是没有意义的,因为引擎必须依赖于该属性的存在并且将以非常特殊的方式使用它。另一方面,自定义属性可能在mods中使用的脚本语言中使用。如果以这种方式组织,您就没有速度问题。低级属性以最大速度访问,而自定义属性按名称访问,但与脚本语言的解释相比,速度的微小损失可以忽略不计。