我正在为游戏制作实体组件系统。 我使用成员变量将我的组件实现为结构:
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
让游戏从中读取类定义。
答案 0 :(得分:1)
您的对象可以具有一组原始属性和自定义属性。您的引擎必须依赖于原始属性的存在,并且通常不会访问自定义属性。例如,在mod中定义“position”属性是没有意义的,因为引擎必须依赖于该属性的存在并且将以非常特殊的方式使用它。另一方面,自定义属性可能在mods中使用的脚本语言中使用。如果以这种方式组织,您就没有速度问题。低级属性以最大速度访问,而自定义属性按名称访问,但与脚本语言的解释相比,速度的微小损失可以忽略不计。