Para un juego en 2D que estoy haciendo (para Android) Estoy usando un sistema basado en componentes donde un GameObject contiene varios objetos GameComponent. GameComponents puede ser elementos tales como componentes de entrada, componentes de renderizado, componentes de emisión de bala, etc. Actualmente, GameComponents tiene una referencia al objeto que los posee y puede modificarlo, pero GameObject solo tiene una lista de componentes y no le importa cuáles son los componentes, siempre y cuando puedan actualizarse cuando se actualice el objeto.Comunicación en el motor de juegos basado en componentes
A veces un componente tiene alguna información que el GameObject necesita saber. Por ejemplo, para la detección de colisiones, GameObject se registra con el subsistema de detección de colisiones para que se le notifique cuando choca con otro objeto. El subsistema de detección de colisión necesita conocer el cuadro delimitador del objeto. Guardo xey en el objeto directamente (porque lo utilizan varios componentes), pero el ancho y el alto solo se conocen por el componente de representación que contiene el mapa de bits del objeto. Me gustaría tener un método getBoundingBox o getWidth en el GameObject que obtenga esa información. O, en general, quiero enviar cierta información de un componente al objeto. Sin embargo, en mi diseño actual, GameObject no sabe qué componentes específicos tiene en la lista.
me ocurren varias maneras de resolver este problema:
En lugar de tener una lista completa de los componentes genéricos, que puede permitir que el GameObject tiene campo específico de algunos de los componentes importantes. Por ejemplo, puede tener una variable miembro llamada renderingComponent; cada vez que necesito obtener el ancho del objeto solo uso
renderingComponent.getWidth()
. Esta solución aún permite una lista genérica de componentes, pero trata a algunos de ellos de manera diferente, y me temo que terminaré teniendo varios campos excepcionales ya que es necesario consultar más componentes. Algunos objetos ni siquiera tienen componentes de renderizado.Tenga la información requerida como miembros de GameObject pero permita que los componentes la actualicen. Por lo tanto, un objeto tiene un ancho y una altura que son 0 o -1 de forma predeterminada, pero un componente de representación puede establecerlos en los valores correctos en su ciclo de actualización. Esto parece un truco y podría terminar empujando muchas cosas a la clase GameObject para mayor comodidad, incluso si no todos los objetos las necesitan.
Haga que los componentes implementen una interfaz que indique qué tipo de información se puede consultar. Por ejemplo, un componente de renderizado implementaría la interfaz HasSize que incluye métodos como getWidth y getHeight. Cuando GameObject necesita el ancho, recorre sus componentes comprobando si implementan la interfaz HasSize (usando la palabra clave
instanceof
en Java ois
en C#). Esto parece una solución más genérica, una desventaja es que la búsqueda del componente puede llevar algo de tiempo (pero la mayoría de los objetos solo tienen 3 o 4 componentes).
Esta pregunta no se trata de un problema específico. Aparece a menudo en mi diseño y me preguntaba cuál es la mejor manera de manejarlo. El rendimiento es algo importante ya que es un juego, pero el número de componentes por objeto es generalmente pequeño (el máximo es 8).
La versión corta
En un sistema basado en componentes para un juego, ¿cuál es la mejor manera de pasar información de los componentes al objeto mientras se mantiene el diseño genérico?
Esperaba que esta fuera la respuesta; que hay muchos enfoques y que todos son viables en diferentes contextos. Tiene razón acerca de los sistemas completamente genéricos, estaba sobre-ingeniería y preocupándome por problemas que no existen. –