【发布时间】:2016-09-21 03:17:58
【问题描述】:
在基于组件的游戏引擎中,当涉及到游戏对象/组件之间的关系时,我遇到了麻烦。
关系存储在哪里,如何删除?
为了简单起见,这里举个例子。
Gradius 克隆游戏包含 2 种游戏对象:-
- 火箭 = 主体组件 + 炮塔组件
- 浮动炮塔 = 炮塔组件(单独)
组件详细信息是:-
- 主体组件 = 一个物理实体 + 一个图形实体
- 炮塔组件 = 一个实体 + 一个图形实体
炮塔组件旨在与主体组件具有关系(物理约束或所有权) .
要求关系必须在两个组件之前删除。
- 例如,这种情况下的关系还包含由外部物理库实现的物理约束,例如子弹物理。
这些是一个特定于示例的描述,以防万一......
删除Rocket的步骤必须按此顺序:-
- 删除约束
- 删除主体组件和炮塔组件(任何顺序都可以)
relation 也应该在 Main Body Component 被删除时移除,而留下 Turret Component,所以让它变成浮动炮塔。
关系应该存储在哪里? (看起来一切正常,但与下一个问题有关。)
- 在新的专用游戏对象(新实体)的新组件中
- 在与 Rocket 相同的实体中的新组件中
- 在一个新的管理器系统中保留了这种特定关系的列表
关系应该如何删除? (两者似乎都是坏主意。)
-
创建一个标志来检查即将删除的Main Body Component或Rocket,然后在删除其他组件之前调用一个新的专用系统来删除关系,它必须每个时间步都在其他管理器系统之前调用。
-
让其他现有经理在要删除主体组件或火箭
时调用新的专用系统
对于存在多种关系类型的一般情况,我期望得到答案。 (游戏对象或组件之间)
编辑1:提出的在Rocket的析构函数中直接创建所有权和添加代码的解决方案是非常反对基于组件的设计的。
- 它将使三个组件(包括约束)非常耦合。
- 此外,组件不应具有非平凡的功能。
我相信析构函数是其中之一,应该避免。
(我曾经有一些对象的膨胀析构函数,它破坏了所有良好的模块化。)
【问题讨论】:
标签: relationship game-engine component-based