Sono abbastanza nuovo per lo sviluppo del gioco (ma non per la programmazione) e sto cercando di capire quale sarebbe il modo migliore per gestire la comunicazione tra i mondi. Quello che voglio dire è questo:
Ho letto dei sistemi di componenti di entità (ECS) e di come le persone suggeriscono di usare mondi / spazi diversi ( http://gamedevelopment.tutsplus.com/tutorials/spaces-useful-game-object-containers--gamedev-14091 ) per una sottosezione di un gioco. Ad esempio un HUD, un inventario o un combattimento / movimento ottengono ciascuno un mondo / spazio separati (perché hanno una grafica e una logica sottostanti diverse).
Tuttavia, mi chiedevo come l'inventario, o l'HUD, fosse a conoscenza della salute di un giocatore quando la salute è gestita da uno spazio / mondo diverso, ad esempio in combattimento?
Ciò vale anche per la progressione del gioco in generale, ad esempio la finestra di dialogo con NPC (una finestra di dialogo sarebbe uno spazio separato poiché è una schermata popup) ma come si trasmetterebbero le scelte fatte (o lo stato di) della finestra di dialogo ad altri spazi / mondi . O praticamente qualsiasi altro tipo di evento che influenza la progressione del gioco in diversi spazi / mondi (salute, mana, missioni, dialoghi, combattimenti, inventario, hud, ecc.)
Come si potrebbe gestire questo tipo di design? È necessario un oggetto singleton (in fase di implementazione) che contenga tutto questo tipo di informazioni? Sarebbe strano perché poi la components
necessità di trasmettere ogni cambiamento a questo oggetto singleton che sembra fare le cose due volte (andando contro il DRY principale della programmazione) ...
Sono in perdita qui in termini di design, qualche suggerimento?
---MODIFICARE---
Quindi ho letto alcuni altri post suggeriti dai commenti e ho avuto un'idea generale delle possibilità, tuttavia ognuna di esse sembra avere un aspetto negativo importante che le rende semplicemente sbagliate. È molto probabile che sto supervisionando i dettagli che potrebbero risolvere questi aspetti negativi, quindi sentiti libero di correggermi. Proverò a fornire una panoramica e alcune risposte ad alcune domande.
Sto vedendo tre opzioni principali per "condividere" i dati tra spazi. Anche se la maggior parte dei post riguarda la condivisione di dati tra sistemi, credo che lo stesso possa essere applicato alla condivisione di dati tra sistemi.
1. Interrogazione
Esempio : se il mondo HUD ha bisogno di conoscere la salute attuale del giocatore, può interrogare un altro mondo e chiedere la salute attuale.
Unico inconveniente : i mondi devono conoscersi a vicenda, il che rappresenta un grave problema di dipendenza e va contro il disaccoppiamento.
2: messaggistica diretta (sincronizzazione e asincronizzazione)
Esempio : se durante il combattimento la salute di un giocatore cambia, può inviare messaggi (sincronizzazione e asincronizzazione, qualunque cosa sia necessaria) ad altri mondi che devono conoscere questo cambiamento.
Unico inconveniente : ancora il problema del disaccoppiamento: i mondi devono conoscersi a vicenda.
3: messaggistica indiretta (sincronizzazione e asincronizzazione) <- opzione migliore
Esempio : se durante il combattimento la salute di un giocatore cambia, può inviare messaggi (sincronizzazione e asincronizzazione, qualunque cosa sia necessaria) all'hub messaggi generale. Altri mondi / sistemi che devono conoscere questa modifica sono abbonati al canale di messaggi specifico e leggono i messaggi.
Upside : completamente disaccoppiato, facilmente gestibile ed estensibile.
Aspetto negativo / poco chiaro : quando il canale dei messaggi sa che i messaggi devono essere eliminati? O forse il sistema sottoscritto contrassegna (solo per se stesso) il messaggio come letto e attende nuovi messaggi -> messagebox diventa enorme dopo un po '. In che modo mondi / sistemi gestiscono l'ordine? Ad esempio durante un frame: se l'HUD ha già eseguito il polling del messaggio di integrità e dopo che lo stato cambia, il frame successivo viene aggiornato. Per alcune applicazioni questo potrebbe non essere il modo giusto.
D: Un singolo oggetto di gioco può esistere in più spazi
Sto usando il framework Artemis ECS che viene fornito con spazi incorporati (chiamati mondi). Ogni entità (e con essa, i dati sotto forma di componenti) viene creata su un mondo e quindi non può essere condivisa tra mondi.