Sono abbastanza nuovo all'idea dei sistemi di entità, avendo letto un sacco di cose (utilmente, questo fantastico blog e questa risposta ).
Anche se ho qualche problema a capire come qualcosa di semplice come riuscire a manipolare la posizione di un oggetto da un numero indefinito di fonti.
Cioè, ho la mia entità, che ha un componente di posizione. Poi ho qualche evento nel gioco che dice a questa entità di muoversi di una data distanza, in un dato tempo.
Questi eventi possono accadere in qualsiasi momento e avranno valori diversi per posizione e tempo. Il risultato è che sarebbero stati composti insieme.
In una soluzione OO tradizionale, avrei una sorta di MoveBy
classe, che contiene la distanza / tempo, e un array di quelli all'interno della mia classe di oggetti di gioco. Ogni fotogramma, scorrerei attraverso tutti MoveBy
e lo applicherei alla posizione. Se a MoveBy
ha raggiunto la fine, rimuoverlo dall'array.
Con il sistema di entità, sono un po 'confuso su come dovrei replicare questo tipo di comportamento.
Se ce ne fosse solo uno alla volta, invece di essere in grado di combinarli insieme, sarebbe abbastanza semplice (credo) e assomiglierebbe a questo:
PositionComponent
contenente x, y
MoveByComponent
contenente x, y, time
Entity
che ha sia a PositionComponent
che aMoveByComponent
MoveBySystem
che cerca un'entità con entrambi questi componenti e aggiunge il valore di MoveByComponent
a PositionComponent
. Quando time
viene raggiunto, rimuove il componente da quell'entità.
Sono un po 'confuso su come farei la stessa cosa con molte mosse.
I miei pensieri iniziali sono che avrei:
PositionComponent
, MoveByComponent
come sopra
MoveByCollectionComponent
che contiene una matrice di MoveByComponent
s
MoveByCollectionSystem
che cerca un'entità con a PositionComponent
e a MoveByCollectionComponent
, che scorre attraverso la MoveByComponent
s al suo interno, applicando / rimuovendo secondo necessità.
Immagino che questo sia un problema più generale, avere molti componenti uguali e volere che un sistema corrispondente agisca su ciascuno di essi. Le mie entità contengono i loro componenti all'interno di un hash di tipo componente -> componente, quindi rigorosamente hanno solo 1 componente di un tipo particolare per entità.
È questo il modo giusto di guardarlo?
Un'entità dovrebbe sempre avere un solo componente di un determinato tipo in ogni momento?
move x by 10 in 2 seconds
e move x by -10 in 2 seconds
l'entità rimarrebbe perfettamente immobile?
MoveBy
funzionalità fosse una specie di velocità? Sembra che tu sia sulla buona strada. Per la tua seconda domanda, ci sono molte diverse implementazioni di sistemi entità / componenti. Quello descritto nella mia risposta che hai collegato avrebbe solo un componente di un determinato tipo.