Immagino che questa domanda o le sue varianti siano passate molto, quindi se quello che sto dicendo è un duplicato e le risposte si trovano altrove, ti prego di informarmi.Gestione degli eventi nella progettazione di un motore di gioco basato su componenti
Ho svolto ricerche sui design dei motori di gioco e ho scoperto il modello di entità basata sui componenti. Sembra promettente, ma sto ancora elaborando la sua implementazione.
sto valutando un sistema in cui il motore è organizzato su diversi "sottosistemi", che gestiscono alcuni aspetti, come il rendering, il suono, la salute, intelligenza artificiale, ecc Ogni sottosistema ha un tipo di componente associato ad esso, come una salute componente per il sottosistema sanitario. Una "entità", ad esempio un NPC, una porta, qualche effetto visivo o il giocatore, è semplicemente composta da uno o più componenti, che quando insieme danno all'entità la sua funzionalità.
Ho identificato quattro principali canali di trasmissione delle informazioni: un componente può trasmettere a tutti i componenti nella sua entità corrente, un componente può trasmettere al suo sottosistema, un sottosistema può trasmettere ai suoi componenti e un sottosistema può trasmettere ad altri sottosistemi.
Ad esempio, se l'utente desiderava spostare i propri caratteri, premere un tasto. Questa pressione del tasto verrebbe rilevata dal sottosistema di input, che quindi trasmetterà l'evento e verrà prelevato dal sottosistema del lettore. Il sottosistema del giocatore invia quindi questo evento a tutti i componenti del giocatore (e quindi alle entità che tali componenti compongono) e tali componenti del giocatore comunicano al componente di posizione della propria entità per andare avanti e muoversi.
Tutto questo per una pressa a chiave sembra un po 'tortuoso, e sono certamente aperto a miglioramenti a questa architettura. Ma comunque, la mia domanda principale segue ancora.
Per quanto riguarda gli eventi stessi, ho considerato dove un evento si comporta come nel modello di visitatore. L'importanza di ciò che voglio è che se un evento incontra un componente che non supporta (come in un evento di mossa non ha nulla a che fare direttamente con l'intelligenza artificiale o la salute), ignorerebbe il componente. Se un evento non trova il componente che sta cercando, non importa.
Il modello di visitatore quasi funziona. Tuttavia, sarebbe necessario disporre di funzioni virtuali per ogni tipo di componente (ad esempio, visitHealthComponent, visitPositionComponent, ecc.) Anche se non ha nulla a che fare con esse. Potrei lasciare queste funzioni vuote (quindi se si imbattesse in quei componenti, sarebbe ignorato), ma dovrei aggiungere un'altra funzione ogni volta che aggiungo un componente.
Le mie speranze erano che sarei stato in grado di aggiungere un componente senza aggiungere necessariamente cose ad altri luoghi e aggiungere un evento senza fare confusione con altre cose.
Quindi, le mie due domande:
- ci sono eventuali miglioramenti mio progetto potrebbe consentire, in termini di efficienza, flessibilità, ecc?
- Quale sarebbe il modo ottimale di gestire gli eventi?