c++ - 为使用对象聚合的程序设计通信系统

标签 c++ oop design-patterns game-engine

我正在制作一个基于组件的游戏引擎,我尝试使用这种设计尽可能地将数据与逻辑分开:

                                      Engine
              /                          |                                \
     EntityManager            ComponentManager                         SystemManager
(vector of entities)      (map of (entities - vector of components)) (vector of systems)

基本上所有这些管理器都相应地只是实体、组件和系统的持有者。

对这些的简要描述是:

实体:表示游戏中每个对象的类(仅和 UUID)。

Component :一个抽象类(它的子类)将只保存关于实体的特定事物的数据,例如 ex。 PositionComponent 将仅具有实体的 x、y 值。

系统:一个抽象类(它的子类)将具有作用于实体的所有逻辑, 前任。 PositionSystem 将在其 Process() 方法中通过引擎传递一个实体来操作,并使用一些预定义的逻辑更改其组件值。

我的问题是,如何让对象像这样交流 senario? 例如,我如何从系统(驻留在 SystemManager 中)向 ComponentManager 发送消息,以便我可以为系统正在处理的当前实体获取特定组件(我已经在 ComponentManager 中有方法来执行此操作,因此我的问题是什么是正确的设计方式来做到这一点)?或者通常是一个被建模的程序
像一个操作系统(从内核到外部世界的层)如何实现每一层之间的通信?是否有任何好的设计模式可用于此目的?

感谢任何帮助。

最佳答案

进行松散耦合通信的一种常见方式是消息传递。 基本上每个组件都有一个收件箱,其他组件将消息发送到该收件箱。 您还可以执行向群组广播等操作。

您应该记住,高度抽象会影响性能,而在游戏中您需要高性能。 所以你应该小心你代码的热部分,意思是那些会被非常频繁调用的部分,

关于c++ - 为使用对象聚合的程序设计通信系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17073652/

相关文章:

java - 如何计算牌值在一副牌中出现的次数

c++ - 在访问多维数组的内置数组和初始化列表时交换标识符和下标

c++ - 为什么不为给定的转换运算符调用构造函数?

c++ - 在 vector 上使用基于范围的 for 循环时,CppCoreChecker C 样式转换警告

c++ - 如何提供许多构造函数,但又没有太多依赖?

java - 这个简单工厂是否违反了开闭原则?

java - 获取Decorator对象的所有类型 : type of wrapped objects and the type of wrapper object

c++ - 这是 iostream.h 和 iostream 之间的区别吗

java - 如何在android中读取XML数据

ios - 从父类(super class) iOS swift 中识别子类