Estoy creando un sistema de objetos de juego basado en componentes . Algunos consejos:
GameObject
es simplemente una lista deComponents
.- Hay
GameSubsystems
. Por ejemplo, renderizado, física, etc. Cada unoGameSubsystem
contiene punteros a algunos deComponents
.GameSubsystem
es 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 Components
en GameSubsystems
(cuando GameObject
se crea y se compone). Hay 4 enfoques :
- 1: Patrón de cadena de responsabilidad . Todos
Component
se ofrecen a todosGameSubsystem
.GameSubsystem
toma una decisión sobre quéComponents
registrar (y cómo organizarlos). Por ejemplo, GameSubsystemRender puede registrar Componentes Renderables.
Pro. Components
No 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 Components
en la misma jerarquía y usar transformaciones relativas a los padres).
estafa. Cheque de todos a todos. Muy ineficiente.
estafa. Subsystems
saber acerca Components
.
- 2: Cada uno
Subsystem
buscaComponents
tipos específicos.
Pro. Mejor rendimiento que en Approach 1
.
estafa. Subsystems
Todavía lo sé Components
.
- 3: se
Component
registra 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. Components
están mal acoplados con GameSubsystems
.
- 4: patrón de mediador .
GameState
(que contieneGameSubsystems
) puede implementar registerComponent (Component *).
Pro. Components
y GameSubystems
no 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.
Components
en GameObjects
está 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 GameSubsystem
está totalmente mal.