基于组件的游戏引擎:如何管理游戏对象之间的关系?
Component based game engine : How to manage relation between game object?
在基于组件的游戏引擎中,当涉及到游戏对象/组件之间的关系时,我遇到了麻烦。
关系存储在哪里,如何删除?
为简单起见,这里有一个例子。
Gradius-clone 游戏由两种类型的游戏对象组成:-
- 火箭=主体组件+炮塔组件
- 浮动炮塔 = 炮塔组件(单独)
组件详细信息是:-
- 主体组件 = 1个物理体+1个图形体
- 炮塔组件 = 一个实体 + 一个图形实体
Turret Component 被设计为具有 关系至 主体组件。
要求必须先删除 关系。
- 例如,这种情况下的关系还包含由外部物理库实现的物理约束,例如子弹物理学。
These are quite an example-specific description, provided just in case ....
Steps to delete Rocket have to be in this order :-
- delete constraint
- delete Main Body Component and Turret Component (any order is ok)
The relation should also be removed when a Main Body Component is deleted, leaving Turret Component alone, so let it become Floating turret.
关系应该存储在哪里? (一切似乎都很好,但与下一个问题有关。)
- 在新的专用游戏对象(新实体)的新组件中
- 在与 Rocket
相同的实体中的新组件内
- 在一个新的管理器系统中,它保留了这种特定类型关系的列表
relation应该怎么删除? (两者似乎都是坏主意。)
创建一个标志来检查即将删除的 Main Body Component 或 Rocket,然后调用一个新的在删除其他组件之前删除关系的专用系统,它必须在每个时间步其他管理器系统之前调用。
让其他现有管理器在想要删除主体组件或Rocket[时调用一个新的专用系统=11=]
我期待有很多关系类型的一般情况的答案。 (在游戏对象或组件之间)
编辑 1:关于在 Rocket 的析构函数中直接创建所有权和添加代码的建议解决方案非常反对基于组件的设计。
- 这将使三个组件(包括约束)非常耦合。
- 此外,组件不应具有重要功能。
我相信析构函数是其中之一,应该避免。
(我曾经有一些对象的膨胀析构函数,它破坏了所有好的模块化。)
在您的 Rocket 游戏对象示例中,关系是一种所有权,应保留在 Rocket 中。如果您的游戏引擎架构允许,则可以在删除之前通过管理器系统调用的游戏对象中的析构函数删除该关系。
编辑:
如果您不希望对象或组件知道它们的所有权或关系,我认为最好的选择是保留一个关系列表(如您所建议的那样)并引用关系的所有者。这样你可以先检查列表,看看你的游戏对象(火箭)是否可以删除,或者它是否有任何 relation/s 先删除。
在基于组件的游戏引擎中,当涉及到游戏对象/组件之间的关系时,我遇到了麻烦。
关系存储在哪里,如何删除?
为简单起见,这里有一个例子。
Gradius-clone 游戏由两种类型的游戏对象组成:-
- 火箭=主体组件+炮塔组件
- 浮动炮塔 = 炮塔组件(单独)
组件详细信息是:-
- 主体组件 = 1个物理体+1个图形体
- 炮塔组件 = 一个实体 + 一个图形实体
Turret Component 被设计为具有 关系至 主体组件。
要求必须先删除 关系。
- 例如,这种情况下的关系还包含由外部物理库实现的物理约束,例如子弹物理学。
These are quite an example-specific description, provided just in case ....
Steps to delete Rocket have to be in this order :-
- delete constraint
- delete Main Body Component and Turret Component (any order is ok)
The relation should also be removed when a Main Body Component is deleted, leaving Turret Component alone, so let it become Floating turret.
关系应该存储在哪里? (一切似乎都很好,但与下一个问题有关。)
- 在新的专用游戏对象(新实体)的新组件中
- 在与 Rocket 相同的实体中的新组件内
- 在一个新的管理器系统中,它保留了这种特定类型关系的列表
relation应该怎么删除? (两者似乎都是坏主意。)
创建一个标志来检查即将删除的 Main Body Component 或 Rocket,然后调用一个新的在删除其他组件之前删除关系的专用系统,它必须在每个时间步其他管理器系统之前调用。
让其他现有管理器在想要删除主体组件或Rocket[时调用一个新的专用系统=11=]
我期待有很多关系类型的一般情况的答案。 (在游戏对象或组件之间)
编辑 1:关于在 Rocket 的析构函数中直接创建所有权和添加代码的建议解决方案非常反对基于组件的设计。
- 这将使三个组件(包括约束)非常耦合。
- 此外,组件不应具有重要功能。
我相信析构函数是其中之一,应该避免。
(我曾经有一些对象的膨胀析构函数,它破坏了所有好的模块化。)
在您的 Rocket 游戏对象示例中,关系是一种所有权,应保留在 Rocket 中。如果您的游戏引擎架构允许,则可以在删除之前通过管理器系统调用的游戏对象中的析构函数删除该关系。
编辑: 如果您不希望对象或组件知道它们的所有权或关系,我认为最好的选择是保留一个关系列表(如您所建议的那样)并引用关系的所有者。这样你可以先检查列表,看看你的游戏对象(火箭)是否可以删除,或者它是否有任何 relation/s 先删除。