Supponiamo di avere una scena composta da un mondo , un giocatore e un boss. Oh, e questo è un gioco in terza persona, quindi hai anche una macchina fotografica .
Quindi la tua scena è così:
class Scene {
World* world
Player* player
Enemy* boss
Camera* camera
}
(Almeno, questi sono i dati di base . Come si contengono i dati, dipende da te.)
Vuoi aggiornare e rendere la scena solo quando stai giocando, non quando in pausa, o nel menu principale ... in modo da collegarla allo stato del gioco!
State* gameState = new State();
gameState->addScene(scene);
Ora il tuo stato di gioco ha una scena. Successivamente, si desidera eseguire la logica sulla scena e renderizzare la scena. Per la logica, è sufficiente eseguire una funzione di aggiornamento.
State::update(double delta) {
scene->update(delta);
}
In questo modo puoi mantenere tutta la logica di gioco della Scene
classe. E solo per motivi di riferimento, un sistema di componenti di entità potrebbe farlo in questo modo invece:
State::update(double delta) {
physicsSystem->applyPhysics(scene);
}
Ad ogni modo, ora sei riuscito ad aggiornare la tua scena. Ora vuoi visualizzarlo! Per il quale facciamo qualcosa di simile al precedente:
State::render() {
renderSystem->render(scene);
}
Ecco qua. RenderSystem legge le informazioni dalla scena e visualizza l'immagine appropriata. Semplificato, il metodo di rendering della scena potrebbe essere simile al seguente:
RenderSystem::renderScene(Scene* scene) {
Camera* camera = scene->camera;
lookAt(camera); // Set up the appropriate viewing matrices based on
// the camera location and direction
renderHeightmap(scene->getWorld()->getHeightMap()); // Just as an example, you might
// use a height map as your world
// representation.
renderModel(scene->getPlayer()->getType()); // getType() will return, for example "orc"
// or "human"
renderModel(scene->getBoss()->getType());
}
Davvero semplificato, avresti comunque bisogno di applicare una rotazione e una traduzione basate su dove si trova il tuo giocatore e dove sta guardando. (Il mio esempio è un gioco 3D, se vai con il 2D, sarà una passeggiata nel parco).
Spero che questo sia quello che stavi cercando? Come puoi sperare di ricordare da quanto sopra, il sistema di rendering non si preoccupa della logica del gioco . Utilizza solo lo stato corrente della scena per eseguire il rendering, ovvero estrae da esso le informazioni necessarie per eseguire il rendering. E la logica del gioco? Non importa cosa fa il renderer. Cavolo, non importa se viene visualizzato!
E non è nemmeno necessario allegare informazioni di rendering alla scena. Dovrebbe essere sufficiente che il renderer sappia che deve eseguire il rendering di un orco. Avrai già caricato un modello di orchi, che il renderer allora sa visualizzare.
Questo dovrebbe soddisfare le tue esigenze. La rappresentazione grafica e la logica sono accoppiate , poiché entrambi utilizzano gli stessi dati. Eppure sono separati , perché nessuno dei due si basa sull'altro!
EDIT: E solo per rispondere perché uno dovrebbe farlo in questo modo? Perché è più facile è la ragione più semplice. Non è necessario pensare a "cosa è successo, dovrei ora aggiornare la grafica". Invece fai accadere cose, e ogni fotogramma del gioco guarda cosa sta succedendo, e lo interpreta in qualche modo, dandoti un risultato sullo schermo.