C++:设计基于组件的实体系统 - 高级问题

Jar*_*rom 12 c++ components entities

在我用C++编写的游戏引擎中,我已经离开了传统的分层实体系统,并构建了一个基于组件的系统.它大致以这种方式工作:

实体仅仅是组件的容器.一些示例组件是:Point,Sprite,Physics,Emitter.

每个实体最多可以容纳每种类型的一个组件.有些组件依赖于另一个组件,比如Physics和Sprite依赖于Point,因为它们需要一个位置和角度.

因此,组件系统的一切正常,但现在我无法实现更专业的实体,例如:

  • 相机,需要额外的功能来处理移动和缩放
  • 一个玩家,需要支持才能接收来自用户的输入并移动

现在,我可以通过继承轻松解决这个问题.只需从实体派生相机并添加其他缩放功能和成员.但这只是错了.

我的问题:

  • 如何用C++中的组件系统解决专用实体的问题?

ltj*_*jax 14

你似乎在怀疑这里的IS-A关系.那么为什么不把它变成一个HAS-A关系呢?相机和播放器可以是具有实体(或对实体的引用)但存在于组件系统之外的对象,而不是实体.这样,您可以轻松保持组件系统的一致性和正交性.

这也非常适合这两个例子(相机/播放器)作为"粘合"对象的含义.播放器将实体系统粘合到输入系统并充当控制器.相机将实体系统粘合到渲染器并充当一种观察者.


小智 0

如何对每个实体可以拥有的组件类型(以及它应该拥有的组件)给予一些限制,并在从该实体派生时放松这些限制。例如通过添加一个虚函数来验证某个组件是否可以添加到实体中。