Estoy tratando de diseñar un sistema de entidad basado en componentes para fines de aprendizaje (y luego usarlo en algunos juegos) y tengo algunos problemas a la hora de actualizar los estados de la entidad.
No quiero tener un método update () dentro del Componente para evitar dependencias entre Componentes.
Lo que actualmente tengo en mente es que los componentes contienen datos y los componentes de actualización de sistemas.
Entonces, si tengo un juego 2D simple con algunas entidades (por ejemplo, jugador, enemigo1, enemigo2) que tienen componentes de Transformación, Movimiento, Estado, Animación y Representación, creo que debería tener:
- Un sistema de movimiento que mueve todos los componentes de movimiento y actualiza los componentes de estado
- Y un RenderSystem que actualiza los componentes de Animación (el componente de animación debe tener una animación (es decir, un conjunto de cuadros / texturas) para cada estado y actualizarlo significa seleccionar la animación correspondiente al estado actual (por ejemplo, saltar, mover_izquierda, etc.), y actualizar el índice del marco). Luego, RenderSystem actualiza los componentes de Render con la textura correspondiente al cuadro actual de la Animación de cada entidad y renderiza todo en la pantalla.
He visto algunas implementaciones como el marco de Artemis, pero no sé cómo resolver esta situación:
Digamos que mi juego tiene las siguientes entidades. Cada entidad tiene un conjunto de estados y una animación para cada estado:
- jugador: "inactivo", "moving_right", "saltando"
- enemigo1: "movimiento_abajo", "movimiento_abajo"
- enemy2: "moving_left", "moving_right"
¿Cuáles son los enfoques más aceptados para actualizar el estado actual de cada entidad? Lo único que se me ocurre es tener sistemas separados para cada grupo de entidades y componentes separados de Estado y Animación, por lo que tendría PlayerState, PlayerAnimation, Enemy1State, Enemy1Animation ... PlayerMovementSystem, PlayerRenderingSystem ... pero creo que esto es malo solución y rompe el propósito de tener un sistema basado en componentes.
Como puede ver, estoy bastante perdido aquí, así que agradecería cualquier ayuda.
EDITAR: Creo que la solución para hacer que esto funcione como tengo la intención es esta:
Hace que el componente de estado y el componente de animación sean lo suficientemente genéricos como para ser utilizados en todas las entidades. Los datos que contienen serán el modificador para cambiar cosas como qué animaciones se reproducen o qué estados están disponibles. - Byte56
Ahora, estoy tratando de descubrir cómo diseñar estos 2 componentes lo suficientemente genéricos como para poder reutilizarlos. ¿Podría ser una buena solución tener un UID para cada estado (por ejemplo, caminar, correr ...) y almacenar animaciones en un mapa en el AnimationComponent con este identificador?
statecomponent
y animationcomponent
lo suficientemente genérico que debe utilizarse para todas las entidades. Los datos que contienen serán el modificador para cambiar cosas como qué animaciones se reproducen o qué estados están disponibles.