Después de repasar algunos patrones de diseño del juego, me decidí por Entity-Component-System (ES System) para mi motor de juego. He leído artículos (principalmente T = Machine ) y reviso algunos códigos fuente y creo que tengo suficiente para comenzar.
Solo hay una idea básica con la que estoy luchando. ¿Cómo trato con grupos de entidades que dependen unas de otras?
Dejame usar un ejemplo:
Suponga que estoy haciendo un tirador aéreo estándar (piense en Jamestown ) y quiero construir una "entidad de jefe" con múltiples partes distintas pero conectadas. El desglose podría verse así:
- Cuerpo del barco: movimiento, renderizado
- Cañón: posición (bloqueado en relación con el cuerpo del barco), seguimiento \ disparar al héroe, recibir daño hasta deshabilitar
- Núcleo: posición (bloqueada en relación con el cuerpo de la nave), seguimiento \ disparar al héroe, recibir daño hasta deshabilitar, deshabilitar (er ... destruir) todas las demás entidades en el grupo de la nave
Mi objetivo sería algo que sería identificado (y manipulado) como un elemento distinto del juego sin tener que reescribir el subsistema desde cero cada vez que quiera construir un nuevo Elemento agregado.
¿Cómo implemento este tipo de diseño en ES System?
- ¿Implemento algún tipo de relación de entidad padre-hijo (las entidades pueden tener hijos)? Esto parece contradecir la metodología de que las entidades son solo contenedores vacíos y lo hace sentir más POO.
- ¿Los implemento como entidades separadas, con algún tipo de componente de conexión (BossComponent) y sistema relacionado (BossSubSystem)? No puedo evitar pensar que esto será difícil de implementar, ya que la forma en que los componentes se comunican parece ser una gran trampa para los osos.
- ¿Los implemento como una sola entidad, con una colección de componentes (ShipComponent, CannonComponents, CoreComponent)? Este parece desviarse de la intención del Sistema ES (los componentes aquí se parecen demasiado a entidades pesadas), pero sé esto, así que pensé que lo pondría ahí.
- ¿Los implemento como algo más que he mencionado?
Sé que esto se puede implementar muy fácilmente en OOP, pero mi elección de ES sobre OOP es una con la que me quedaré. Si necesito romper con la teoría pura de ES para implementar este diseño, lo haré (no es que no haya tenido que comprometer el diseño puro antes), pero preferiría hacerlo por razones de rendimiento en lugar de comenzar con un mal diseño.
Para obtener un crédito adicional, piense en el mismo diseño, pero cada una de las "entidades de jefe" estaba realmente conectada a una "entidad de BigBoss" más grande hecha de un cuerpo principal, núcleo principal y 3 "Entidades de jefe". Esto me permitiría ver una solución para al menos 3 dimensiones (abuelo-padre-hijo) ... que debería ser más que suficiente para mí.