Załóżmy, że masz scenę złożoną ze świata , gracza i bossa. Aha, to jest gra dla trzeciej osoby, więc masz też aparat .
Twoja scena wygląda następująco:
class Scene {
World* world
Player* player
Enemy* boss
Camera* camera
}
(Przynajmniej są to podstawowe dane . To, jak je przechowujesz, zależy od ciebie.)
Chcesz aktualizować i renderować scenę tylko podczas gry, a nie w trybie pauzy lub w menu głównym ... więc dołącz ją do stanu gry!
State* gameState = new State();
gameState->addScene(scene);
Teraz twój stan gry ma scenę. Następnie chcesz uruchomić logikę na scenie i renderować scenę. Dla logiki wystarczy uruchomić funkcję aktualizacji.
State::update(double delta) {
scene->update(delta);
}
W ten sposób możesz zachować całą logikę gry w Scene
klasie. I tylko dla odniesienia, system komponentu encji może to zrobić w ten sposób:
State::update(double delta) {
physicsSystem->applyPhysics(scene);
}
W każdym razie udało Ci się zaktualizować scenę. Teraz chcesz to wyświetlić! W tym celu wykonujemy coś podobnego do powyższego:
State::render() {
renderSystem->render(scene);
}
Proszę bardzo. RenderSystem odczytuje informacje ze sceny i wyświetla odpowiedni obraz. Uproszczona metoda renderowania sceny może wyglądać następująco:
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());
}
Naprawdę uproszczone, nadal musisz na przykład zastosować rotację i tłumaczenie w zależności od tego, gdzie jest twój gracz i gdzie szuka. (Mój przykład to gra 3D, jeśli wybierzesz 2D, będzie to spacer po parku).
Mam nadzieję, że tego właśnie szukałeś? Jak miejmy nadzieję, możesz przypomnieć sobie z powyższego, system renderowania nie dba o logikę gry . Używa tylko bieżącego stanu sceny do renderowania, tj. Pobiera z niej niezbędne informacje w celu renderowania. A logika gry? Nie ma znaczenia, co robi moduł renderujący. Cholera, nie ma znaczenia, czy w ogóle jest wyświetlany!
Nie musisz też dołączać informacji o renderowaniu do sceny. Powinno wystarczyć, aby mechanizm renderujący wiedział, że musi wyrenderować orka. Załadujesz już model orka, który renderer wie, aby wyświetlić.
To powinno spełnić twoje wymagania. Reprezentacja graficzna i logika są połączone , ponieważ oba wykorzystują te same dane. Jednak są one oddzielne , ponieważ żadne z nich nie polega na drugim!
EDYCJA: I tylko po to, żeby odpowiedzieć, dlaczego tak się dzieje? Ponieważ to łatwiejsze jest najprostszym powodem. Nie musisz myśleć o „tak i tak się stało, powinienem teraz zaktualizować grafikę”. Zamiast tego sprawiasz, że coś się dzieje, a każda klatka gra patrzy na to, co się obecnie dzieje, i interpretuje to w jakiś sposób, dając ci wynik na ekranie.