Supongamos que tiene una escena compuesta de un mundo , un jugador y un jefe. Ah, y este es un juego en tercera persona, así que también tienes una cámara .
Entonces su escena se ve así:
class Scene {
World* world
Player* player
Enemy* boss
Camera* camera
}
(Al menos, esos son los datos básicos . La forma en que contenga los datos depende de usted).
Solo quieres actualizar y renderizar la escena cuando estás jugando, no cuando estás en pausa o en el menú principal ... ¡así que lo adjuntas al estado del juego!
State* gameState = new State();
gameState->addScene(scene);
Ahora tu estado de juego tiene una escena. A continuación, desea ejecutar la lógica en la escena y renderizar la escena. Para la lógica, solo ejecuta una función de actualización.
State::update(double delta) {
scene->update(delta);
}
De esa manera puedes mantener toda la lógica del juego en la Scene
clase. Y solo por el bien de referencia, un sistema de componentes de entidad podría hacerlo así:
State::update(double delta) {
physicsSystem->applyPhysics(scene);
}
De todos modos, ahora has logrado actualizar tu escena. ¡Ahora quieres mostrarlo! Para lo cual hacemos algo similar a lo anterior:
State::render() {
renderSystem->render(scene);
}
Ahí tienes. El renderSystem lee la información de la escena y muestra la imagen adecuada. Simplificado, el método para renderizar la escena podría verse así:
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());
}
Realmente simplificado, aún necesitarías, por ejemplo, aplicar una rotación y traducción en función de dónde está tu jugador y dónde está mirando. (Mi ejemplo es un juego en 3D, si vas con 2D, será un paseo por el parque).
Espero que esto sea lo que estabas buscando? Como se puede recordar de lo anterior, al sistema de render no le importa la lógica del juego . Solo usa el estado actual de la escena para renderizar, es decir, extrae la información necesaria para renderizar. ¿Y la lógica del juego? No le importa lo que haga el renderizador. ¡Diablos, no le importa si se muestra en absoluto!
Y tampoco necesita adjuntar información de representación a la escena. Debería ser suficiente que el renderizador sepa que necesita representar un orco. Ya habrá cargado un modelo orco, que el renderizador sabe mostrar.
Esto debería satisfacer sus requisitos. La representación gráfica y la lógica están acopladas , porque ambas usan los mismos datos. Sin embargo, están separados , ¡porque ninguno de los dos depende del otro!
EDITAR: ¿Y solo para responder por qué uno lo haría así? Porque es más fácil es la razón más simple. No necesita pensar en "tal y tal sucedió, ahora debería actualizar los gráficos". En cambio, haces que las cosas sucedan, y cada cuadro del juego mira lo que está sucediendo actualmente, y lo interpreta de alguna manera, dándote un resultado en pantalla.