Tenía una pregunta sobre la arquitectura del juego: ¿Cuál es la mejor manera de que diferentes componentes se comuniquen entre sí?
Realmente me disculpo si esta pregunta ya se ha hecho un millón de veces, pero no puedo encontrar nada con exactamente el tipo de información que estoy buscando.
He estado tratando de construir un juego desde cero (C ++ si es importante) y he observado algún software de juegos de código abierto en busca de inspiración (Super Maryo Chronicles, OpenTTD y otros). Noté que muchos de estos diseños de juegos usan instancias globales y / o singletons en todo el lugar (para cosas como colas de renderizado, gestores de entidades, gestores de video, etc.). Intento evitar instancias globales y singletons y construir un motor que esté lo más acoplado posible, pero me encuentro con algunos obstáculos que se deben a mi inexperiencia en el diseño efectivo. (Parte de la motivación para este proyecto es abordar esto :))
He creado un diseño donde tengo un GameCore
objeto principal que tiene miembros que son análogos a las instancias globales que veo en otros proyectos (es decir, tiene un administrador de entrada, un administrador de video, un GameStage
objeto que controla todas las entidades y el juego) para cualquier etapa que esté cargada actualmente, etc.). El problema es que, dado que todo está centralizado en el GameCore
objeto, no tengo una manera fácil para que los diferentes componentes se comuniquen entre sí.
Mirando Super Maryo Chronicles, por ejemplo, cada vez que un componente del juego necesita comunicarse con otro componente (es decir, un objeto enemigo quiere agregarse a la cola de renderizado para ser dibujado en la etapa de renderizado), solo habla con el instancia global
Para mí, tengo que hacer que mis objetos del juego pasen información relevante al GameCore
objeto, para que el GameCore
objeto pueda pasar esa información a los otros componentes del sistema que la necesita (es decir, para la situación anterior, cada objeto enemigo pasaría su información de renderizado al GameStage
objeto, que lo recolectaría todo y se lo devolvería GameCore
, lo que a su vez lo pasaría al administrador de video para su renderizado). Parece un diseño realmente horrible, y estaba tratando de pensar en una resolución para esto. Mis pensamientos sobre posibles diseños:
- Instancias globales (diseño de Super Maryo Chronicles, OpenTTD, etc.)
- Hacer que el
GameCore
objeto actúe como un intermediario a través del cual se comunican todos los objetos (diseño actual descrito anteriormente) - Proporcione punteros de componentes a todos los demás componentes con los que necesitarán hablar (es decir, en el ejemplo de Maryo anterior, la clase enemiga tendría un puntero al objeto de video con el que necesita hablar)
- Divida el juego en subsistemas: por ejemplo, tenga objetos de administrador en el
GameCore
objeto que manejen la comunicación entre los objetos en su subsistema - (¿Otras opciones? ....)
Me imagino que la opción 4 anterior es la mejor solución, pero tengo algunos problemas para diseñarla ... tal vez porque he estado pensando en términos de los diseños que he visto que usan globales. Parece que estoy tomando el mismo problema que existe en mi diseño actual y lo estoy replicando en cada subsistema, solo que a una escala menor. Por ejemplo, el GameStage
objeto descrito anteriormente es un intento de esto, pero el GameCore
objeto todavía está involucrado en el proceso.
¿Alguien puede ofrecer algún consejo de diseño aquí?
¡Gracias!