Soy bastante nuevo en la idea de los sistemas de entidades, después de haber leído un montón de cosas (lo más útil, este gran blog y esta respuesta ).
Aunque tengo algunos problemas para entender cómo algo tan simple como poder manipular la posición de un objeto por un número indefinido de fuentes.
Es decir, tengo mi entidad, que tiene un componente de posición. Luego tengo algún evento en el juego que le dice a esta entidad que se mueva una distancia dada, en un momento dado.
Estos eventos pueden ocurrir en cualquier momento y tendrán diferentes valores para la posición y el tiempo. El resultado es que se combinarían entre sí.
En una solución OO tradicional, tendría algún tipo de MoveByclase, que contiene la distancia / tiempo, y un conjunto de aquellos dentro de mi clase de objeto de juego. Cada cuadro, iteraría a través de todo MoveBy, y lo aplicaría a la posición. Si a MoveByha alcanzado su tiempo de finalización, retírelo de la matriz.
Con el sistema de entidades, estoy un poco confundido sobre cómo debería replicar este tipo de comportamiento.
Si hubiera solo uno de estos a la vez, en lugar de poder combinarlos, sería bastante sencillo (creo) y se vería algo así:
PositionComponent que contiene x, y
MoveByComponent que contiene x, y, time
Entityque tiene tanto a PositionComponentcomo aMoveByComponent
MoveBySystemque busca una entidad con estos dos componentes, y añade el valor de MoveByComponentla PositionComponent. Cuando timese alcanza, elimina el componente de esa entidad.
Estoy un poco confundido sobre cómo haría lo mismo con muchos movimientos.
Mis pensamientos iniciales son que tendría:
PositionComponent, MoveByComponentlo mismo que arriba
MoveByCollectionComponentque contiene una matriz de MoveByComponents
MoveByCollectionSystemque busca una entidad con a PositionComponenty a MoveByCollectionComponent, iterando a través de la MoveByComponents dentro de ella, aplicando / eliminando según sea necesario.
Supongo que este es un problema más general, de tener muchos de los mismos componentes y querer que un sistema correspondiente actúe sobre cada uno. Mis entidades contienen sus componentes dentro de un hash de tipo de componente -> componente, por lo que estrictamente tienen solo 1 componente de un tipo particular por entidad.
¿Es esta la forma correcta de ver esto?
¿Debería una entidad solo tener un componente de un tipo dado en todo momento?
move x by 10 in 2 secondsy move x by -10 in 2 secondsla entidad se quedaría perfectamente quieta?
MoveByfuncionalidad fuera solo una velocidad? Parece que estás en el camino correcto. Para su segunda pregunta, hay muchas implementaciones diferentes de sistemas de entidad / componente. El que se describe en mi respuesta que vinculó solo tendría un componente de un tipo dado.