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 MoveBy
clase, 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 MoveBy
ha 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
Entity
que tiene tanto a PositionComponent
como aMoveByComponent
MoveBySystem
que busca una entidad con estos dos componentes, y añade el valor de MoveByComponent
la PositionComponent
. Cuando time
se 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
, MoveByComponent
lo mismo que arriba
MoveByCollectionComponent
que contiene una matriz de MoveByComponent
s
MoveByCollectionSystem
que busca una entidad con a PositionComponent
y a MoveByCollectionComponent
, iterando a través de la MoveByComponent
s 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 seconds
y move x by -10 in 2 seconds
la entidad se quedaría perfectamente quieta?
MoveBy
funcionalidad 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.