Angenommen, Sie haben eine Szene die aus einer Welt , einem Spieler und einem Boss besteht. Oh, und das ist ein Spiel für Dritte, also hast du auch eine Kamera .
Ihre Szene sieht also so aus:
class Scene {
World* world
Player* player
Enemy* boss
Camera* camera
}
(Zumindest, das ist die Grunddaten . Wie Sie die Daten enthalten, zu Ihnen auf.)
Sie möchten die Szene nur aktualisieren und rendern, wenn Sie das Spiel spielen, nicht wenn sie angehalten ist oder im Hauptmenü ... also hängen Sie sie an den Spielstatus an!
State* gameState = new State();
gameState->addScene(scene);
Jetzt hat Ihr Spielstatus eine Szene. Als Nächstes möchten Sie die Logik für die Szene ausführen und die Szene rendern. Für die Logik führen Sie einfach eine Aktualisierungsfunktion aus.
State::update(double delta) {
scene->update(delta);
}
Auf diese Weise können Sie die gesamte Spiellogik in der behalten Scene
Klasse . Und nur als Referenz könnte ein Entitätskomponentensystem dies stattdessen so machen:
State::update(double delta) {
physicsSystem->applyPhysics(scene);
}
Wie auch immer, Sie haben es jetzt geschafft, Ihre Szene zu aktualisieren. Jetzt möchten Sie es anzeigen! Für die wir etwas Ähnliches tun wie oben:
State::render() {
renderSystem->render(scene);
}
Los geht's. Das renderSystem liest die Informationen aus der Szene und zeigt das entsprechende Bild an. Vereinfacht ausgedrückt könnte die Methode zum Rendern der Szene folgendermaßen aussehen:
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());
}
Wirklich vereinfacht, müssten Sie beispielsweise noch eine Rotation und Übersetzung anwenden, die darauf basiert, wo sich Ihr Spieler befindet und wo er sucht. (Mein Beispiel ist ein 3D-Spiel. Wenn Sie sich für 2D entscheiden, ist dies ein Spaziergang im Park.)
Ich hoffe das ist was du gesucht hast? Wie Sie sich hoffentlich aus dem oben Gesagten erinnern können, ist das Render-System kümmert sich nicht um die Logik des Spiels . Es wird nur der aktuelle Status der Szene zum Rendern verwendet, dh es werden die erforderlichen Informationen zum Rendern daraus abgerufen. Und die Spiellogik? Es ist egal, was der Renderer macht. Heck, es ist egal, ob es überhaupt angezeigt wird!
Außerdem müssen Sie der Szene keine Rendering-Informationen hinzufügen. Es sollte ausreichen, dass der Renderer weiß, dass er einen Ork rendern muss. Du hast bereits ein Ork-Modell geladen, das der Renderer dann anzeigen kann.
Dies sollte Ihren Anforderungen entsprechen. Die grafische Darstellung und die Logik sind gekoppelt , da beide dieselben Daten verwenden. Dennoch sind sie getrennt , weil sich keiner auf den anderen verlässt!
EDIT: Und nur um zu beantworten, warum man es so machen würde? Weil es einfacher ist, ist der einfachste Grund. Sie müssen nicht darüber nachdenken, "so und so ist passiert, ich sollte jetzt die Grafiken aktualisieren". Stattdessen machst du Dinge möglich, und in jedem Frame des Spiels wird untersucht, was gerade passiert, und es wird auf irgendeine Weise interpretiert, sodass du ein Ergebnis auf dem Bildschirm erhältst.