Ultimamente ho lavorato su un piccolo progetto personale che è fondamentalmente un sistema di Entity Component System con sistemi aggiornati.
Anche se ho un'idea abbastanza precisa del modo in cui il framework dovrebbe funzionare, a causa della mancanza di esperienza, ho problemi a mantenere tutto disaccoppiato.
Alcuni dettagli sul framework:
Ogni entità è definita dai suoi componenti.
I sistemi sono responsabili della modifica effettiva delle entità modificandone i componenti.
Al fine di migliorare la località di riferimento, invece di mantenere ciascun componente nell'entità appropriata, tutti i componenti sono memorizzati in vettori omogenei e ogni entità mantiene un elenco di indici per ciascun vettore.
Poiché ogni sistema modifica componenti specifici, dovrebbe mantenere un elenco solo delle entità con i componenti corrispondenti.
Il modo in cui mi sono occupato di tutto questo fino ad ora era avere un ComponentManager, un EntityManager e un SystemManager. Queste classi tuttavia hanno un accoppiamento molto stretto l'una con l'altra. EntitManager deve avere accesso a ComponentManager per gestire la dimensione degli elenchi di indici e la mappatura di ciascun tipo di componente. Ha anche bisogno di accedere per aggiungere effettivamente i componenti nel vettore appropriato. Un altro accoppiamento è tra EntityManager e SystemManager. Ogni volta che un'entità viene creata, deve essere aggiunta all'elenco dei Sistemi appropriati.
Un bus di eventi generici sembra aiutare ma non sono sicuro di come implementarlo senza renderlo globale.
Come posso migliorare questo design rimuovendo l'accoppiamento pur mantenendo la funzionalità del sistema?