Avevo una domanda sull'architettura di gioco: qual è il modo migliore per far comunicare componenti diversi tra loro?
Mi scuso davvero se questa domanda è già stata posta un milione di volte, ma non riesco a trovare nulla con esattamente il tipo di informazioni che sto cercando.
Ho cercato di creare un gioco da zero (C ++ se è importante) e ho osservato alcuni software di gioco open source per l'ispirazione (Super Maryo Chronicles, OpenTTD e altri). Ho notato che molti di questi design di giochi utilizzano istanze globali e / o singoli in tutto il luogo (per cose come code di rendering, gestori di entità, gestori di video e così via). Sto cercando di evitare istanze globali e singoli e costruire un motore che sia accoppiato il più liberamente possibile, ma sto colpendo alcuni ostacoli che devo alla mia inesperienza nel design efficace. (Parte della motivazione per questo progetto è di affrontare questo :))
Ho costruito un progetto in cui ho un GameCore
oggetto principale che ha membri analoghi alle istanze globali che vedo in altri progetti (ad esempio, ha un gestore di input, un gestore di video, un GameStage
oggetto che controlla tutte le entità e il gioco per qualunque fase sia attualmente caricata, ecc.). Il problema è che, poiché tutto è centralizzato GameCore
nell'oggetto, non ho un modo semplice per comunicare componenti diversi tra loro.
Guardando Super Maryo Chronicles, ad esempio, ogni volta che un componente del gioco deve comunicare con un altro componente (ovvero, un oggetto nemico vuole aggiungersi alla coda di rendering per essere disegnato nella fase di rendering), parla solo con istanza globale.
Per quanto mi riguarda, devo fare in modo che i miei oggetti di gioco restituiscano le informazioni rilevanti GameCore
all'oggetto, in modo che l' GameCore
oggetto possa passare tali informazioni agli altri componenti del sistema che ne hanno bisogno (ovvero: per la situazione sopra, ogni oggetto nemico passerebbe le informazioni di rendering GameStage
all'oggetto, che le raccoglierebbe tutte e le restituirebbe GameCore
, che a sua volta le passerebbe al gestore video per il rendering). Sembra un design davvero orribile così com'è, e stavo cercando di pensare a una soluzione a questo. Le mie opinioni su possibili progetti:
- Istanze globali (progettazione di Super Maryo Chronicles, OpenTTD, ecc.)
- Avere l'
GameCore
oggetto agire come un intermediario attraverso il quale tutti gli oggetti comunicano (disegno attuale descritto sopra) - Fornisci puntatori ai componenti a tutti gli altri componenti con cui dovranno parlare (ad esempio, nell'esempio di Maryo sopra, la classe nemica avrebbe un puntatore all'oggetto video con cui deve parlare)
- Suddividere il gioco in sottosistemi - Ad esempio, avere oggetti manager
GameCore
nell'oggetto che gestiscono la comunicazione tra oggetti nel loro sottosistema - (Altre opzioni? ....)
Immagino che l'opzione 4 sopra sia la soluzione migliore, ma ho qualche problema a progettarla ... forse perché ho pensato in termini di design che ho visto usare i globuli. Mi sembra di prendere lo stesso problema esistente nel mio progetto attuale e di replicarlo in ciascun sottosistema, solo su scala ridotta. Ad esempio, l' GameStage
oggetto sopra descritto è in qualche modo un tentativo in questo, ma l' GameCore
oggetto è ancora coinvolto nel processo.
Qualcuno può offrire qualche consiglio di progettazione qui?
Grazie!