Este es un seguimiento de esta pregunta, que respondí, pero esta aborda un tema mucho más específico.
Esta respuesta me ayudó a entender Entity Systems incluso mejor que el artículo.
Leí el (sí, el) artículo sobre Entity Systems, y me dijo lo siguiente:
Las entidades son solo una identificación y una matriz de componentes (los artículos dicen que almacenar entidades en componentes no es una buena manera de hacer las cosas, pero no proporciona una alternativa).
Los componentes son datos que indican lo que se puede hacer con una determinada entidad.
Los sistemas son los "métodos", realizan la manipulación de datos en entidades.
Esto parece realmente práctico en muchas situaciones, pero la parte de que los componentes son solo clases de datos me está molestando. Por ejemplo, ¿cómo podría implementar mi clase Vector2D (posición) en un sistema de entidades?
La clase Vector2D contiene datos: coordenadas xey, pero también tiene métodos , que son cruciales para su utilidad y distinguen la clase de una matriz de dos elementos. Ejemplo métodos son: add()
, rotate(point, r, angle)
, substract()
, normalize()
, y todo otro estándar, métodos útiles, y absolutamente necesarios que las posiciones (que son instancias de la clase Vector2D) debería tener.
Si el componente fuera solo un titular de datos, ¡no podría tener estos métodos!
Una solución que probablemente podría aparecer sería implementarlos dentro de los sistemas, pero eso parece muy contrario a la intuición. Estos métodos son cosas que quiero realizar ahora , que estén completos y listos para usar. ¡No quiero esperar a MovementSystem
que lean un conjunto caro de mensajes que le indican que realice un cálculo sobre la posición de una entidad!
Y, el artículo establece muy claramente que solo los sistemas deberían tener alguna funcionalidad, y la única explicación para eso, que pude encontrar, fue "evitar la POO". En primer lugar, no entiendo por qué debería abstenerme de utilizar métodos en entidades y componentes. La sobrecarga de memoria es prácticamente la misma, y cuando se combina con sistemas, estos deberían ser muy fáciles de implementar y combinar de maneras interesantes. Los sistemas, por ejemplo, solo podían proporcionar lógica básica a entidades / componentes, que conocen la implementación por sí mismos. Si me preguntas, esto es básicamente tomar las cosas buenas de ES y OOP, algo que no se puede hacer de acuerdo con el autor del artículo, pero para mí parece una buena práctica.
Piensa en ello de esta manera; Hay muchos tipos diferentes de objetos dibujables en un juego. Plain Old imágenes, animaciones ( update()
, getCurrentFrame()
, etc.), combinaciones de estos tipos primitivos, y todos ellos podrían simplemente proporcionar un draw()
método para hacer que el sistema, que entonces no necesita preocuparse por cómo se implementa el sprite de una entidad, sólo se sobre la interfaz (dibujar) y la posición. Y luego, solo necesitaría un sistema de animación que llamara métodos específicos de animación que no tienen nada que ver con el renderizado.
Y solo otra cosa ... ¿Existe realmente una alternativa a las matrices cuando se trata de almacenar componentes? No veo otro lugar para almacenar componentes que no sean matrices dentro de una clase de entidad ...
Tal vez, este es un mejor enfoque: almacenar componentes como propiedades simples de entidades. Por ejemplo, un componente de posición estaría pegado entity.position
.
La única otra forma sería tener algún tipo de tabla de búsqueda extraña dentro de los sistemas, que haga referencia a diferentes entidades. Pero eso parece muy ineficiente y más complicado de desarrollar que simplemente almacenar componentes en la entidad.