【问题标题】:Component based game engine : How to manage relation between game object?基于组件的游戏引擎:如何管理游戏对象之间的关系?
【发布时间】:2016-09-21 03:17:58
【问题描述】:

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

关系存储在哪里,如何删除?

为了简单起见,这里举个例子。

Gradius 克隆游戏包含 2 种游戏对象:-

  1. 火箭 = 主体组件 + 炮塔组件
  2. 浮动炮塔 = 炮塔组件(单独)

组件详细信息是:-

  1. 主体组件 = 一个物理实体 + 一个图形实体
  2. 炮塔组件 = 一个实体 + 一个图形实体

炮塔组件旨在与主体组件具有关系(物理约束或所有权) .

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

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

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

删除Rocket的步骤必须按此顺序:-

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

relation 也应该在 Main Body Component 被删除时移除,而留下 Turret Component,所以让它变成浮动炮塔

关系应该存储在哪里? (看起来一切正常,但与下一个问题有关。)

  1. 在新的专用游戏对象(新实体)的新组件中
  2. 在与 Rocket 相同的实体中的新组件中
  3. 在一个新的管理器系统中保留了这种特定关系的列表

关系应该如何删除? (两者似乎都是坏主意。)

  1. 创建一个标志来检查即将删除的Main Body ComponentRocket,然后在删除其他组件之前调用一个新的专用系统来删除关系,它必须每个时间步都在其他管理器系统之前调用。

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

    时调用新的专用系统

对于存在多种关系类型的一般情况,我期望得到答案。 (游戏对象或组件之间)

编辑1:提出的在Rocket的析构函数中直接创建所有权和添加代码的解决方案是非常反对基于组件的设计的。

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

【问题讨论】:

    标签: relationship game-engine component-based


    【解决方案1】:

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

    编辑: 如果您不希望对象或组件了解它们的所有权或关系,我认为最好的选择是保留一个关系列表(如您所建议的)并引用关系的所有者。这样你就可以先检查列表,看看你的游戏对象(火箭)是否可以被删除,或者它是否有任何关系需要先删除。

    【讨论】:

    • 谢谢,但我担心它会破坏模块化。更多反馈被编辑到问题中。
    猜你喜欢
    • 2011-04-26
    • 2010-12-26
    • 1970-01-01
    • 2017-07-27
    • 2017-06-25
    • 2012-01-14
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    相关资源
    最近更新 更多