Hay una multitud de formas de representar e implementar sistemas de componentes de entidad, pero aquí hay una explicación de una manera. Tenga en cuenta que no existe una definición concreta de arquitecturas de entidad / componente / sistema, por lo que esta es solo una implementación.
Voy a presentar una analogía para las arquitecturas de entidad / componente / sistema que podrían ayudar. Pensemos en una entidad como una clave.
La entidad
Las llaves también tienen dientes (azul oscuro). Los dientes de nuestra clave de entidad son los componentes que la componen. Puede distinguir las entidades por su ID, incluso si tienen los mismos dientes. Entonces, ¿en qué encajan las llaves? Cabellos. Las cerraduras son nuestros sistemas. Por ejemplo, un sistema de movimiento.
El sistema
El bloqueo solo funciona si nuestra llave tiene dientes tanto para la posición como para la velocidad. Este sistema solo procesa entidades que tienen una posición y una velocidad. Hay varias formas de configurar cómo estos sistemas reconocen qué entidades procesar, pero una es usar a long
. Cada bit está reservado para un tipo de componente. Para nuestro ejemplo, supongamos un tipo de 4 bits en lugar de una longitud de 64 bits. Nuestra entidad de ejemplo tendría todos los componentes disponibles. Entonces su clave sería 1111
. Entonces, el sistema está buscando cualquier entidad que tenga un 11--
. (Al -
representante no le importa, porque al movimiento no le importa si hay un sprite o salud). Puede verificar una entidad con una AND
operación simple . Entonces nuestra entidad coincide con if ((1111 & 1100) == 1100)
. Si te perdí allí, mira más sobre las operaciones bit a bit .
Como puede ver, los sistemas tienen acceso a recursos externos. Pueden acceder a la hora, gráficos, sonido, etc. Son simplemente pequeños procesadores que toman una clave a la vez y procesan datos. Usted ve que el sistema de movimiento toma la velocidad, el tiempo delta y la posición; luego hace algunos cálculos y almacena el resultado nuevamente en su posición.
Las claves de entidad son realmente fáciles de generar. Puede agregarlos o eliminarlos a voluntad. A la entidad no le importa, es solo una forma de agrupar y mantener los componentes. Los componentes no tienen interdependencia. Lo más cerca que los componentes se relacionan entre sí es cuando un sistema opera en ellos y usa datos de uno para actualizar otro, como nuestro ejemplo de movimiento.
Echemos un vistazo a otro sistema para ayudar a solidificar la idea:
Este es nuestro sistema de dibujo. Busca componentes que coincidan 1-1-
. Esta entidad coincide porque: ((1111 & 1010) == 1010)
Además, puede ver que este sistema genera información en la pantalla, dibujando el sprite de la entidad en su posición.
De acuerdo, uno más. Veamos otra entidad y veamos cómo podría encajar en nuestro ejemplo hasta ahora.
Como puede ver, esta entidad tiene menos componentes unidos. Al observar los componentes que tiene, parece que podría ser un elemento estático como una roca. Solo tiene una posición y un sprite. No se moverá y no se verá afectado por ningún cambio de salud. Esta entidad produciría una clave de 1010. Entonces, ¿qué sistemas operan en esta entidad? Vamos a revisar:
Contra nuestro sistema de movimiento:
((1010 & 1100) != 1100)
No. Parece que el sistema de movimiento no se preocupa por esta entidad, porque no tiene los componentes necesarios.
Contra nuestro sistema de dibujo:
((1010 & 1010) == 1010)
Oye, eso es un partido. Esta entidad será operada por el sistema de dibujo. El sistema de dibujo dibujará el sprite en la posición definida.
Esperemos que pueda ver lo fácil que sería agregar ahora otro sistema que tome nuestros componentes y los opere. Permítanme asegurarme de haber respondido sus preguntas:
¿Qué pasa si varios sistemas necesitan acceso al mismo componente? ¿Dónde deberían vivir los datos?
Por lo general, los sistemas funcionan uno tras otro. Procesan todas las entidades que coinciden con sus requisitos, luego el siguiente sistema hace lo mismo y así sucesivamente. Los datos viven con la entidad. No debería haber nada almacenado en el sistema, es solo una cerradura que se activa, la clave es donde permanece la información y se mueve de una cerradura a otra.
¿Cómo se construyen las entidades? ¿Están los sistemas intrínsecamente vinculados a un componente? Si quiero introducir algún componente nuevo, ¿también tengo que introducir un nuevo sistema o modificar uno existente?
Las entidades son solo bolsas de componentes. Tienen una identificación única y una lista de componentes. Los sistemas solo están vinculados a componentes de la manera descrita anteriormente. Puede tener componentes sin sistemas que operen en ellos, pero eso no tiene sentido. Del mismo modo, puede tener sistemas que buscan componentes que ninguna entidad tiene. Eso es menos inútil, porque pueden estar esperando que se cree una entidad que coincida con su bloqueo. Entonces, sí, si introduce un nuevo componente, desearía crear un sistema que utilice ese componente. De lo contrario, solo está agregando dientes a su llave para una cerradura que no existe.
Si mi entidad es solo una identificación, ¿cómo puedo saber que mi entidad de robot necesita ser movida o renderizada y, por lo tanto, modificada por algún sistema?
Creo que respondo esto con la idea de una long
clave que define los componentes contenidos en una entidad. Lo sabes porque la llave se ajusta a la cerradura.
¡Uf! ¡Esa fue una publicación larga! (O al menos así parece desde mi monitor grande).