在游戏子系统中注册游戏对象组件?(基于组件的游戏对象设计)


11

我正在创建一个基于组件的游戏对象系统。一些技巧:

  1. GameObject只是的清单Components
  2. GameSubsystems。例如,渲染,物理等。每个都GameSubsystem包含一些指向的指针ComponentsGameSubsystem是一个非常强大且灵活的抽象:它代表游戏世界的任何部分(或方面)。

有在登记的机构的需要ComponentsGameSubsystems(当GameObject被创建和组成)。有4种方法


  • 1:责任链模式。每个人都Component被提供给每个人GameSubsystemGameSubsystem决定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 *)。

ComponentsGameSubystems什么都不知道对方。

骗子 在C ++中,它看起来像丑陋且缓慢的typeid开关。


问题: 哪种方法更好,并且主要用于基于组件的设计?什么做法说?关于实施的任何建议Approach 4

谢谢。


我闻到工程过度。组件向GameObject注册。如果我认为是GameSubsystem,那么它只是可以立即添加到GameObject的组件列表。您如何描述它听起来像是某种“魔术”游戏对象和组件如何组合在一起(它们彼此搜索?为什么?)。我还感觉到您正在尝试将组件用于引擎中的几乎所有内容,对此我也会重新考虑。对于什么是值得我只会考虑选择3或4
LearnCocos2D

@GamingHorror,注册ComponentsGameObjects是我的问题的范围了。阅读有关基于组件的方法的文章,或者如果对此感兴趣,请在本网站上问您自己的问题。您的想法GameSubsystem完全错误。
topright 2010年

我倾向于开发用于游戏逻辑的组件,而不是引擎组件,并且您的描述似乎指向那个方向。我对组件系统非常了解,我想我被淘汰了,因为我不熟悉您使用的术语,尤其是GameSubsystem。从我读到的内容来看,听起来好像您正在尝试仅通过组件构建所有内容(例如整个引擎)。
LearnCocos2D 2010年

是的,“基于组件的游戏对象”和“面向组件的编程”是不同的术语,可能会造成混淆。不要有所偏差,最好是“bilased”:scottbilas.com/files/2002/gdc_san_jose/game_objects_slides.ppt
topright

Answers:


3

3号门...组件在GameSubsystem中注册

组件就位,可以保持从GameObject本身抽象的耦合。不知何故,实际上某些地方确实需要与子系统进行交互,这就是组件及其用途。

在这种情况下,耦合实际上并不是一件坏事。

性能基本上需要在这种情况下,如果你希望有任何在您的系统的复杂性,你只是不能搜索风格接近的其他选项。

最后,如果一个子系统需要对另一个子系统做出反应(渲染器,物理学,音频在发生某些事情时都需要做一些事情),则组件可以通过游戏对象相互促进,并保持这种特殊类型的跨系统耦合可通过组件。


1
非常好。但是组件如何了解GameSubsystems?所有子系统都是单例吗?这不是很丑吗?...我在考虑另一种解决方案,例如依赖注入...,但是何时以及谁将子系统实例传递给每个组件?
Dani

@Dani Components不需要直接访问子系统实例,它们只需要发送一条消息来要求完成注册,它们不需要知道子系统是什么(但是它们很有可能)以及为什么他们会单身吗?这不是必需的,即使在大多数情况下,每个子系统只需要一个子系统实例即可。
Pablo Ariel

@Pablo-同意。
瑞克(Rick)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.