0

我想为我的游戏设计一个实体系统,只使用 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(),然后检查实例类型,但是用我的方法我有点迷路了。

我的方法不好吗?我应该坚持使用虚拟功能还是有办法处理这个问题?

4

1 回答 1

1

你问如何创建一个Entity* selectEntity()可以返回 Unit* 或 Tree* (或者可能是其他东西)的通用函数。

你可以通过返回一个基类指针来做到这一点。Unit 和 Tree 继承自 Entity,Entity 可以包含一个小的枚举,例如:

enum class EntityType : uint8_t {
    Unit, Tree, // ...
};

如果您不想使用继承,则可以在每种类型的实体中只使用成员变量的公共初始子序列,如下所示:

struct Unit {
    EntityType type;
    // ...
};

这相当于内存布局方面的继承版本,您可以从 EntityType* 返回selectEntity(),它实际上将指向 Unit 或 Tree 的第一个成员。

于 2018-11-12T11:30:43.633 回答