Sto aggiornando la mia risposta perché molte cose non erano chiare prima dei commenti. Per favore, nudo con me mentre spiego i miei pensieri.
In generale, due aspetti chiave da considerare in qualsiasi progetto sono la coesione e l' accoppiamento . Sappiamo tutti che abbiamo bisogno di elevata coesione e basso accoppiamento per poter realizzare un design più riutilizzabile ed estensibile.
Quindi, se il mondo deve gestire tutto, ciò significa che ha una bassa coesione e un accoppiamento stretto (perché deve sapere e fare tutto). Tuttavia, questo è anche il caso in cui un'entità di gioco deve fare tutto. Aggiorna la sua posizione, renderizza la sua trama, ecc. Ecc.
Ciò a cui sei veramente interessato è creare sistemi incentrati su un aspetto dell'entità. Ad esempio, un'entità di gioco potrebbe avere una trama, ma un renderizzatore sarebbe responsabile del rendering di quella trama sullo schermo. Al Renderer non importa quali altre proprietà ha l'entità.
Portandolo un po 'oltre, un'entità di gioco è semplicemente una borsa di proprietà. Queste proprietà sono manipolate da sistemi focalizzati su proprietà specifiche. Ed è qui che entrano in gioco i sistemi di entità basati su componenti (CBES), dove proprietà = componenti.
In particolare, CBES con sistemi (o sottosistemi). Questo design tende ad avere alcuni sistemi focalizzati su componenti specifici di un'entità senza preoccuparsi di quali altri componenti l'entità abbia. Inoltre, i sistemi sono associati solo alle informazioni necessarie per elaborare questi componenti.
Facciamo il tuo esempio. Poiché l'input di dove spostare l'entità si basa sul controller del giocatore, probabilmente avresti un PlayerControllerSystem. Questo sistema controllerebbe, a parte molte altre cose, il Componente di posizione dell'entità. In questo caso, il PlayerControllerSystem dovrebbe conoscere il Level e il PositionComponent. Se in seguito decidessi di aggiungere il rilevamento delle collisioni, creeresti un CollisionSystem che utilizzerebbe nuovamente la posizione delle entità, ma questa volta per calcolare i riquadri di delimitazione (o potresti avere un BoundingBoxComponent, la tua chiamata). Il fatto è che puoi facilmente attivare o disattivare il comportamento (anche al volo) semplicemente aggiungendo / rimuovendo i componenti. Quindi, più comportamento significa che più sistemi stanno manipolando i componenti di un'entità, ma sono tutti in una classe ben definita con basso accoppiamento. Vuoi lo scripting? Aggiungi un componente Script. BAM! Hai appena aggiunto funzionalità di scripting con 2 classi. Fisica? Suono? Ancora lo stesso.
Quindi, il motivo per cui sto sostenendo CBES con sottosistemi è che è perfettamente OO e un sistema globale facilmente gestibile / estensibile. Aggiungere un comportamento a un'entità è semplice come decidere quali dati hanno bisogno di quel comportamento e quali entità ne hanno bisogno.
Per ulteriori informazioni sui sistemi di entità basati su componenti con sottosistemi, esiste un'eccellente serie di post di blog di T = Machine presso Entity Systems, il futuro dello sviluppo di MMOG . L'autore è persino arrivato alla creazione di un wiki per la raccolta di varie implementazioni nominate Entity Systems Project
Un post generale (e ben noto) sui sistemi di entità basati su componenti in generale è Evolve la tua gerarchia che ha creato il sistema per Tony Hawk Pro.
Infine, se stai cercando una libreria con un codice di esempio, non andare oltre la libreria Artemis . Artemis è principalmente in Java ma qui c'è una porta in C # (che sto attualmente usando nel mio progetto XNA).
Actor
saperloworld
?