Los sistemas de entidades basados en componentes están de moda en estos días; todos parecen estar de acuerdo en que son el camino a seguir, pero nadie realmente tiene una implementación definitiva de dicho sistema. Me preguntaba, ¿qué papel tienen los estados de entidad (caminar a la izquierda, pararse, saltar, etc.) en un CBS? ¿Actúan como controladores (es decir, manejan eventos y cambian los atributos de la entidad según esos eventos)?
¿Qué sucede con los casos en que un estado requeriría, por ejemplo, que la entidad entre en modo sin clip? ¿Debería ese estado, cuando entra, establecer el componente de colisión de la entidad en un puntero nulo o algo así? (Luego, al salir, el estado debe restaurar el componente de colisión de la entidad a su estado anterior).
Además, supongo que es el trabajo del estado actual cambiar el estado de la entidad a otra cosa, ¿verdad?
fuente
Respuestas:
Tenía la impresión de que en un diseño basado en componentes, las entidades son esencialmente contenedores de componentes (posiblemente con algún mensaje incluido). Visto desde esta perspectiva, cada componente almacenaría un poco del estado. Por ejemplo, si los componentes de comportamiento fantasma deciden que necesita ingresar al modo intangible, también envía un mensaje al componente de física diciéndole que habilite no-clip. Probablemente también enviaría un mensaje a los componentes del modelo fantasma diciéndole que levante el alfa.
fuente
Las máquinas de estado y los componentes son técnicas ortogonales. Puede tener estados en sus componentes o no, tal como puede tener estados en cualquier clase. Puede hacer que un componente observe (vea Patrón de observador) y cambie el estado de otro componente. Las máquinas de estado tienen muchos usos y la implementación dependerá de sus necesidades.
Para el personaje, el personaje que describiste (caminar, pararte, saltar), he visto implementaciones donde todos los componentes mantienen sus propias máquinas de estado ... física, animación, controles, ai. Los componentes deben tener una autoridad clara sobre a qué otros componentes reaccionan y a qué estados de componentes pueden cambiar.
fuente
Diseñe los componentes como estructuras solo con datos, sin lógica más compleja que getters y setters. No cree dependencias entre componentes o terminará perdiendo la mayoría de los beneficios de un sistema de entidades.
Vea un ejemplo de este enfoque (cerca de t-machine vision) aquí: https://github.com/thelinuxlich/starwarrior_CSharp
Y el motor en sí: https://github.com/thelinuxlich/artemis_CSharp
fuente