Estoy creando un sistema de objetos de juego basado en componentes . Algunos consejos:
GameObjectes simplemente una lista deComponents.- Hay
GameSubsystems. Por ejemplo, renderizado, física, etc. Cada unoGameSubsystemcontiene punteros a algunos deComponents.GameSubsystemes una abstracción muy poderosa y flexible: representa cualquier porción (o aspecto) del mundo del juego.
Existe la necesidad de un mecanismo de registro Componentsen GameSubsystems(cuando GameObjectse crea y se compone). Hay 4 enfoques :
- 1: Patrón de cadena de responsabilidad . Todos
Componentse ofrecen a todosGameSubsystem.GameSubsystemtoma una decisión sobre quéComponentsregistrar (y cómo organizarlos). Por ejemplo, GameSubsystemRender puede registrar Componentes Renderables.
Pro. ComponentsNo sé nada acerca de cómo se usan. Bajo acoplamiento. A. Podemos agregar nuevos GameSubsystem. Por ejemplo, agreguemos GameSubsystemTitles que registra todo ComponentTitle y garantiza que cada título es único y proporciona una interfaz para buscar objetos por título. Por supuesto, ComponentTitle no debe reescribirse o heredarse en este caso. B. Podemos reorganizar los existentes GameSubsystems. Por ejemplo, GameSubsystemAudio, GameSubsystemRender, GameSubsystemParticleEmmiter se pueden combinar en GameSubsystemSpatial (para colocar todo el audio, el emisor, el render Componentsen la misma jerarquía y usar transformaciones relativas a los padres).
estafa. Cheque de todos a todos. Muy ineficiente.
estafa. Subsystemssaber acerca Components.
- 2: Cada uno
SubsystembuscaComponentstipos específicos.
Pro. Mejor rendimiento que en Approach 1.
estafa. SubsystemsTodavía lo sé Components.
- 3: se
Componentregistra enGameSubsystem(s). Sabemos en tiempo de compilación que hay un GameSubsystemRenderer, así que ComponentImageRender llamará a algo como GameSubsystemRenderer :: register (ComponentRenderBase *).
Pro. Actuación. No hay controles innecesarios como en Approach 1.
estafa. Componentsestán mal acoplados con GameSubsystems.
- 4: patrón de mediador .
GameState(que contieneGameSubsystems) puede implementar registerComponent (Component *).
Pro. Componentsy GameSubystemsno saben nada el uno del otro.
estafa. En C ++ se vería como un interruptor typeid feo y lento.
Preguntas:
¿Qué enfoque es mejor y se usa principalmente en el diseño basado en componentes? ¿Qué dice la práctica? ¿Alguna sugerencia sobre la implementación de Approach 4?
Gracias.
Componentsen GameObjectsestá fuera del alcance de mi pregunta. Lea artículos sobre el enfoque basado en componentes o haga su propia pregunta en este sitio si está interesado en él. Lo que piensas GameSubsystemestá totalmente mal.