我想为我的游戏设计一个实体系统,只使用 C 和一小部分 C++。很多人使用继承来做到这一点,但我偶然发现了标记的联合,并了解到你可以通过这种方式获得类似的结果,因为虚拟函数对于游戏来说很慢(所以我从 Casey Mouratori 和 Jon Blow 那里听说过,我从中画了两个游戏开发者很多灵感)。
struct Unit {
int type;
int hp;
union {
struct {
int kingID;
} soldier_data;
struct {
string name;
} king_data;
};
}
Jon Blow 使用尚未发布的新语言 Jai 中的一些特性来避免使用虚函数,所以上面的例子是我唯一的想法。
例如,我可以只编写一个更新函数并使用类型来区分实体。这将是一个非常大的函数,但是嘿,我们避免使用虚函数。
事情是我的游戏包含让我们说士兵和树木。树是静态的,几乎什么都不做,所以我会为树实体编写另一个更轻的结构,以节省一些内存,并使用联合来存储不同类型的树:
struct TreeEntity {
Texture* texture;
union {
struct {
int height;
} pineTree_data;
struct {
string name;
} coconutTree_data;
}
}
我面临的问题是,如果士兵和树木都是可点击的怎么办?如果我使用了继承,我会简单地拥有一个函数 Entity* selectEntity(),然后检查实例类型,但是用我的方法我有点迷路了。
我的方法不好吗?我应该坚持使用虚拟功能还是有办法处理这个问题?