Soy bastante nuevo en el desarrollo de juegos (pero no en la programación) y estoy tratando de descubrir cuál sería la mejor manera de manejar la comunicación entre mundos. Lo que quiero decir es esto:
He estado leyendo sobre los sistemas de componentes de entidad (ECS) y cómo la gente sugiere usar diferentes mundos / espacios ( http://gamedevelopment.tutsplus.com/tutorials/spaces-useful-game-object-containers--gamedev-14091 ) para Una subsección de un juego. Por ejemplo, un HUD, inventario o combate / movimiento obtienen cada uno un mundo / espacio separado (porque tienen diferentes gráficos y lógica subyacente.
Sin embargo, me preguntaba cómo el inventario, o el HUD sabe sobre la salud de un jugador cuando la salud es manejada por un espacio / mundo diferente, por ejemplo, en combate.
Esto también se aplica a la progresión del juego en general, por ejemplo, el diálogo con NPC (un diálogo sería un espacio separado ya que es una pantalla emergente), pero ¿cómo transmitiría las elecciones realizadas (o el estado del) diálogo a otros espacios / mundos . O básicamente cualquier otro tipo de evento que influya en la progresión del juego en diferentes espacios / mundos (salud, maná, misiones, diálogo, combate, inventario, hud, etc.)
¿Cómo se manejaría este tipo de diseño? ¿Necesita un objeto singleton (en implementación) que contenga todo este tipo de información? Eso sería extraño porque entonces la components
necesidad de transmitir cada cambio a este objeto singleton que se siente como hacer dos veces (ir en contra del DRY principal de la programación) ...
Estoy un poco perdido aquí en términos de diseño, ¿algún indicador?
---EDITAR---
Así que he leído algunas otras publicaciones sugeridas por los comentarios y tengo una idea general sobre las posibilidades, sin embargo, cada una de ellas parece tener una desventaja importante que las hace simplemente incorrectas. Es muy posible que esté supervisando los detalles que resolverían estos inconvenientes, así que no dude en corregirme. Trataré de dar una visión general, así como algunas respuestas a algunas preguntas.
Veo tres opciones principales para 'compartir' datos entre espacios. Aunque la mayoría de las publicaciones tratan sobre compartir datos entre sistemas, siento que lo mismo se puede aplicar para compartir datos entre sistemas.
1. Consultando
Ejemplo : si el mundo de HUD necesita conocer la salud actual del jugador, puede consultar otro mundo y preguntar por la salud actual.
Desventaja : los mundos necesitan conocerse entre sí, lo cual es un problema importante de dependencia y va en contra del desacoplamiento.
2: mensajería directa (sincronización y asíncrono)
Ejemplo : si durante el combate la salud de un jugador cambia, puede enviar mensajes (sincronización y asíncrono, lo que sea necesario) a otros mundos que necesitan saber sobre este cambio.
Desventaja : sigue siendo el problema del desacoplamiento: los mundos necesitan saber unos de otros.
3: Mensajes indirectos (sincronización y asíncrono) <- la mejor opción
Ejemplo : si durante el combate cambia la salud de un jugador, puede enviar mensajes (sincronización y sincronización, lo que sea necesario) al centro de mensajes general. Otros mundos / sistemas que necesitan saber sobre este cambio se suscriben al canal de mensajes en particular y leen los mensajes.
Al revés : completamente desacoplado, fácilmente manejable y extensible.
Desventaja / poco claro : ¿Cuándo sabe el canal de mensajes que los mensajes deben eliminarse? O tal vez el sistema que está suscrito marca (solo para sí mismo) el mensaje como leído y espera nuevos mensajes -> messagebox se vuelve enorme después de un tiempo. ¿Cómo manejan el orden los mundos / sistemas? Por ejemplo, durante un marco: si el HUD ya sondeó el mensaje de salud y después de eso el estado cambia, el siguiente marco se actualiza. Para algunas aplicaciones esto podría no ser la forma correcta.
P: Un objeto de juego único puede existir en múltiples espacios.
Estoy usando el marco Artemis ECS que viene con espacios integrados (llamados mundos). Cada entidad (y con ella, los datos en forma de componentes) se crean en un mundo y, por lo tanto, no se pueden compartir entre mundos.