我正在创建一个基于组件的游戏对象系统。一些技巧:
GameObject
只是的清单Components
。- 有
GameSubsystems
。例如,渲染,物理等。每个都GameSubsystem
包含一些指向的指针Components
。GameSubsystem
是一个非常强大且灵活的抽象:它代表游戏世界的任何部分(或方面)。
有在登记的机构的需要Components
在GameSubsystems
(当GameObject
被创建和组成)。有4种方法:
- 1:责任链模式。每个人都
Component
被提供给每个人GameSubsystem
。GameSubsystem
决定Components
要注册的内容(以及如何组织)。例如,GameSubsystemRender可以注册可渲染组件。
亲 Components
对如何使用它们一无所知。低耦合。答:我们可以添加新的GameSubsystem
。例如,让我们添加GameSubsystemTitles来注册所有ComponentTitle,并确保每个标题都是唯一的,并提供按标题查询对象的接口。当然,在这种情况下,ComponentTitle不应该被重写或继承。B.我们可以重组现有的GameSubsystems
。例如,可以将GameSubsystemAudio,GameSubsystemRender,GameSubsystemParticleEmmiter合并到GameSubsystemSpatial中(以将所有音频,发射器,渲染Components
置于相同的层次结构中并使用父相对转换)。
骗子 每次检查。效率很低。
骗子 Subsystems
知道Components
。
- 2:每个
Subsystem
搜索Components
特定类型。
亲 性能比更好Approach 1
。
骗子 Subsystems
仍然知道Components
。
- 3:在中
Component
注册自己GameSubsystem(s)
。我们在编译时知道有一个GameSubsystemRenderer,所以让ComponentImageRender调用类似GameSubsystemRenderer :: register(ComponentRenderBase *)之类的东西。
亲 性能。没有像中那样不必要的检查Approach 1
。
骗子 Components
与...严重耦合GameSubsystems
。
- 4:调解员模式。
GameState
(包含GameSubsystems
)可以实现registerComponent(Component *)。
亲 Components
和GameSubystems
什么都不知道对方。
骗子 在C ++中,它看起来像丑陋且缓慢的typeid开关。
问题:
哪种方法更好,并且主要用于基于组件的设计?什么做法说?关于实施的任何建议Approach 4
?
谢谢。
Components
的GameObjects
是我的问题的范围了。阅读有关基于组件的方法的文章,或者如果对此感兴趣,请在本网站上问您自己的问题。您的想法GameSubsystem
完全错误。