Papel de un estado de entidad en un sistema basado en componentes?

8

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?

Paul Manta
fuente
55
Yo diría que no hay una "implementación definitiva" porque todos los juegos tienen requisitos diferentes, y cada decisión que tomes en el diseño de un sistema tiene su propio conjunto de compensaciones. Solo haz lo que tenga sentido para ti y asegúrate de refactorizar cuando las cosas se pongan complicadas.
Tetrad
@El Pato Comunista, estaba un poco bajo ... jaja
desaceleratedcaviar

Respuestas:

9

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.

deft_code
fuente
2

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.

Evan Rogers
fuente
2

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

thelinuxlich
fuente
Estoy bastante en desacuerdo con "ninguna lógica más compleja que getters y setters", pero vengo del marco de referencia de Unity donde todo es un componente. Creo que los componentes deberían poder administrarse por sí mismos.
Tetrad
1
Es porque Unity no tiene nada como Sistemas conectados al juego en sí, que procesan las entidades cuyos componentes componen el aspecto del sistema.
thelinuxlich