我对游戏体系结构有一个疑问:使不同组件相互通信的最佳方法是什么?
如果这个问题已经被问了一百万遍,我真的很抱歉,但是我找不到任何与我正在寻找的信息完全相同的信息。
我一直在尝试从头开始构建游戏(如果需要的话,请使用C ++),并观察了一些开源游戏软件的灵感(超级玛丽纪事报,OpenTTD等)。我注意到许多此类游戏设计在整个地方使用全局实例和/或单例(用于渲染队列,实体管理器,视频管理器等)。我试图避免使用全局实例和单例,并构建一个尽可能松散耦合的引擎,但是由于我对有效设计的缺乏经验,我遇到了一些障碍。(此项目的部分动机是解决这个问题:)
我已经建立了一个设计,其中有一个主要GameCore
对象,该对象的成员类似于我在其他项目中看到的全局实例(即,它具有一个输入管理器,一个视频管理器,一个GameStage
控制所有实体和游戏玩法的对象)对于当前加载的任何阶段等)。问题在于,由于一切都集中在GameCore
对象中,所以我没有一种简单的方法来使不同的组件相互通信。
例如,以《超级玛丽纪事》为例,每当游戏的某个组件需要与另一个组件进行通信时(即,一个敌对对象想要将其自身添加到要在渲染阶段绘制的渲染队列中),它只会与全局实例。
对我来说,我必须让我的游戏对象将相关信息传递回该GameCore
对象,以便该GameCore
对象可以将该信息传递给需要它的系统的其他组件(即:对于上述情况,每个敌人对象会将其渲染信息传递回GameStage
对象,对象将收集所有信息并将其传递回GameCore
,然后依次将其传递给视频管理器进行渲染)。这确实感觉像是一个非常可怕的设计,而我正试图考虑一个解决方案。我对可能的设计的想法:
- 全局实例(Super Maryo Chronicles设计,OpenTTD等)
- 让
GameCore
对象充当中间对象,所有对象都通过该中间人进行通信(上述当前设计) - 为组件提供指向它们将要与之交谈的所有其他组件的指针(即,在上面的Maryo示例中,敌人类将具有一个与之交谈的视频对象的指针)
- 将游戏分为子系统-例如,在对象中具有管理器对象,以
GameCore
处理子系统中对象之间的通信 - (其他选项?...。)
我以为上面的选项4是最好的解决方案,但是我在设计它时遇到了一些麻烦……也许是因为我一直在考虑使用全局变量的设计。感觉就像我正在处理当前设计中存在的相同问题,并在每个子系统中以较小的比例复制它。例如,GameStage
上面描述的对象为此在某种程度上做了尝试,但是该GameCore
对象仍然参与该过程。
有人可以在这里提供任何设计建议吗?
谢谢!