I sistemi dovrebbero archiviare una coppia chiave-valore di Entity to Component in una sorta di mappa, oggetto dizionario o array associativo (a seconda della lingua utilizzata). Inoltre, quando crei il tuo Entity Object, non mi preoccuperei di memorizzarlo in un gestore a meno che non sia necessario essere in grado di annullare la registrazione da uno qualsiasi dei Sistemi. Un'entità è un composto di componenti, ma non dovrebbe gestire nessuno degli aggiornamenti dei componenti. Ciò dovrebbe essere gestito dai sistemi. Tratta invece la tua Entità come una chiave che è mappata a tutti i componenti che contiene nei sistemi, così come un hub di comunicazione per far dialogare tra loro quei componenti.
Il bello dei modelli Entity-Component-System è che puoi implementare abbastanza facilmente la capacità di passare i messaggi da un componente al resto dei componenti di un'entità. Ciò consente a un componente di parlare con un altro componente senza sapere chi sia quel componente o come gestirlo. Passa invece un messaggio e consente al componente di cambiare se stesso (se esiste)
Ad esempio, un sistema di posizione non contiene molto codice, ma tiene traccia degli oggetti Entity associati ai loro componenti di posizione. Ma quando una posizione cambia, possono inviare un messaggio all'entità interessata, che a sua volta viene trasmessa a tutti i componenti di tale entità. Una posizione cambia per qualsiasi motivo? Il sistema di posizione invia a Entity un messaggio che dice che la posizione è cambiata, e da qualche parte, il componente di rendering dell'immagine di quell'entità ottiene quel messaggio e si aggiorna dove verrà disegnato successivamente.
Al contrario, un sistema fisico deve sapere cosa stanno facendo tutti i suoi oggetti; Deve essere in grado di vedere tutti gli oggetti del mondo per testare le collisioni. Quando si verifica una collisione, aggiorna il componente di direzione dell'entità inviando una sorta di "Messaggio di cambio di direzione" all'entità invece di fare riferimento direttamente al componente dell'entità. Questo disaccoppia il manager dalla necessità di sapere come cambiare direzione usando un messaggio invece di fare affidamento su un componente specifico che si trova lì (che potrebbe non essere affatto lì, nel qual caso il messaggio cadrà solo per non udenti invece di un errore si verifica perché un oggetto previsto era assente).
Noterai un enorme vantaggio da questo poiché hai menzionato che hai un'interfaccia di rete. Un componente di rete ascolta tutti i messaggi in arrivo che tutti gli altri dovrebbero conoscere. Adora i pettegolezzi. Quindi, quando il Sistema di rete si aggiorna, i componenti di Rete inviano quei messaggi ad altri Sistemi di Rete su altri computer client, che quindi reinviano quei messaggi a tutti gli altri componenti per aggiornare le posizioni dei giocatori, ecc. Potrebbe essere necessaria una logica speciale in modo che solo determinate entità possano inviare messaggi attraverso la rete, ma questa è la bellezza del sistema, puoi semplicemente controllare la logica registrandoti le cose giuste.
In breve:
Entity è una composizione di componenti che possono ricevere messaggi. L'entità può ricevere messaggi, delegando tali messaggi a tutti i loro componenti per aggiornarli. (Posizione modificata Messaggio, Direzione cambio velocità, ecc.) È come una cassetta postale centrale che tutti i componenti possono ascoltare gli uni dagli altri invece di parlare direttamente tra loro.
Il componente è una piccola parte di un'entità che memorizza un certo stato dell'entità. Questi sono in grado di analizzare determinati messaggi e gettarne altri. Ad esempio, un "Componente di direzione" si occuperebbe solo di "Messaggi di cambio di direzione" ma non di "Messaggi di cambio di posizione". I componenti aggiornano il proprio stato in base ai messaggi, quindi aggiornano gli stati di altri componenti inviando messaggi dal proprio sistema.
Il sistema gestisce tutti i componenti di un determinato tipo ed è responsabile dell'aggiornamento di tali componenti per ciascun frame, nonché dell'invio di messaggi dai componenti che gestiscono alle entità a cui appartengono i componenti
I sistemi potrebbero essere in grado di aggiornare tutti i loro componenti in parallelo e archiviare tutti i messaggi mentre vanno. Quindi, quando l'esecuzione dei metodi di aggiornamento di tutti i sistemi è completa, si chiede a ciascun sistema di inviare i propri messaggi in un ordine specifico. I controlli prima possibile, seguiti da Fisica, seguiti da direzione, posizione, rendering, ecc. Importa in quale ordine vengono inviati poiché un Cambio di direzione fisica dovrebbe sempre pesare un cambio di direzione basato sul controllo.
Spero che sia di aiuto. È un inferno di un modello di progettazione, ma è ridicolmente potente se fatto bene.