【发布时间】:2011-07-04 09:51:02
【问题描述】:
在我用 C++ 编写的游戏引擎中,我已经摆脱了经典的分层实体系统并构建了一个基于组件的实体系统。它大致是这样工作的:
实体只是组件的容器。一些示例组件包括:Point、Sprite、Physics、Emitter。
每个实体最多可以包含每种类型的一个组件。某些组件依赖于另一个组件,例如 Physics 和 Sprite 依赖于 Point,因为它们需要由它传递的位置和角度。
所以组件系统一切正常,但现在我无法实现更专业的实体,例如:
- 相机,需要额外的功能来处理移动和缩放
- 需要支持才能接收用户输入并移动的玩家
现在,我可以通过继承轻松解决这个问题。只需从实体派生相机并添加其他缩放功能和成员。但这只是感觉不对。
我的问题:
- 如何使用 C++ 中的组件系统解决专门实体的问题?
【问题讨论】:
-
将相机和玩家变成实体有什么好处?为什么它们不应该是它们自己的东西,它们本来就是古怪的东西呢?我注意到您对“播放器”的描述实际上只是 MVC 的控制器端,并且不适用于其他播放器(如果存在)。我的主要观点是:不要创建一个创新系统,只是为了让它成为一个阻止你在独特案例上做正确事情的球和链条。
-
@Mike:我希望我的实体系统是统一的。相机基本上无非是一个有位置的实体,我发现这样做是合乎逻辑的,也是正确的做法。玩家也一样,仅此而已,玩家拥有物理实体的所有典型属性。
-
难道你不能像为其他独特功能一样为播放器和相机制作新的组件类型吗?
-
@Jay:不,但相机和玩家对我来说绝对是实体,它们是存在于世界空间中的对象。
-
我认为将玩家的游戏内表示(这是一个物理实体)与玩家本身(世界的控制器)分开是一个好主意。同样,您可以将相机作为实体(在世界上具有位置)与对该相机的解释(渲染缩放等)分开。
标签: c++ components entities