基于组件的游戏引擎:如何管理游戏对象之间的关系?

时间:2016-05-24 04:48:08

标签: relationship game-engine component-based

在基于组件的游戏引擎中,我遇到游戏对象/组件之间的关系时会遇到麻烦。

存储关系的位置以及如何删除它们?

为了简单起见,这是一个例子。

Gradius-clone游戏由两种类型的游戏对象组成: -

  1. 火箭 =主体组件+炮塔组件
  2. 浮动炮塔 =炮塔组件(单独)
  3. 组件细节如下: -

    1. 主体组件 =一个物理主体+一个图形主体
    2. 炮塔组件 =一个物理身体+一个图形主体
    3. 炮塔组件旨在与主体组件具有 关系 (物理约束或所有权)

      要求必须在两个组件之前删除 关系

      • 例如,这种情况下的关系还包含由外部物理库实现的物理约束,例如,子弹物理学。
        

      这些是一个特定于示例的描述,以防万一....

           

      删除 Rocket 的步骤必须遵循以下顺序: -

           
          
      1. 删除 约束
      2.   
      3. 删除主体组件炮塔组件(任何顺序都可以)
      4.         

        删除主体组件时,也应删除 关系 ,只留下 Turret Component ,所以让它变成浮动炮塔

      应该在哪里存储 关系 ? (一切似乎都好,但与下一个问题有关。)

      1. 在新专用游戏对象(新实体)中的新组件内
      2. 在与 Rocket
      3. 相同的实体中的新组件内
      4. 在一个新的经理系统中,该系统保留了这种特定关系的列表
      5. 如何删除 关系 ? (两者似乎都是坏主意。)

        1. 创建一个标记以检查即将删除的主体组件 Rocket ,然后在删除其他组件之前调用新的专用系统删除关系,必须在每个步骤之前调用其他经理系统。

        2. 让其他现有经理在想要删除主体组件火箭

          我期待有很多关系类型的一般情况的答案。 (游戏对象或组件之间)

          编辑1 :关于在Rocket的析构函数中直接创建所有权和添加代码的建议解决方案完全违反基于组件的设计。

          • 它将使三个组件(包括约束)非常耦合。
          • 此外,组件不应具有非平凡的功能    我相信析构函数就是其中之一,应该避免  (我曾经有一些膨胀的析构函数,它会破坏所有良好的模块性。)

1 个答案:

答案 0 :(得分:0)

在你的Rocket游戏对象的例子中,关系是一个所有权,应该保存在Rocket中。如果您的游戏引擎架构允许,则可以通过管理器系统在删除之前调用的游戏对象中的析构函数来删除该关系。

修改 如果您不希望对象或组件知道其所有权或关系,我认为最好的选择是保持关系的列表(如您所建议的)以及对关系所有者的引用。这样你就可以先查看列表,看看你的游戏对象(Rocket)是否可以删除,或者是否有任何关系要先删除。