Предположим, у вас есть сцена, состоящая из мира , игрока и босса. О, и это игра от третьего лица, поэтому у вас также есть камера .
Итак, ваша сцена выглядит так:
class Scene {
World* world
Player* player
Enemy* boss
Camera* camera
}
(По крайней мере, это основные данные . Как вы их содержите, зависит от вас.)
Вы хотите обновлять и визуализировать сцену только тогда, когда играете в игру, а не в режиме паузы или в главном меню ... поэтому вы присоединяете ее к состоянию игры!
State* gameState = new State();
gameState->addScene(scene);
Теперь в вашем игровом состоянии есть сцена. Далее вы хотите запустить логику на сцене и визуализировать сцену. Для логики, вы просто запускаете функцию обновления.
State::update(double delta) {
scene->update(delta);
}
Таким образом, вы можете сохранить всю игровую логику в Scene
классе. И просто для справки, система компонентов сущности может сделать это следующим образом:
State::update(double delta) {
physicsSystem->applyPhysics(scene);
}
В любом случае, теперь вам удалось обновить свою сцену. Теперь вы хотите отобразить это! Для чего мы делаем что-то похожее на вышеперечисленное:
State::render() {
renderSystem->render(scene);
}
Вот и ты. RenderSystem считывает информацию со сцены и отображает соответствующее изображение. Упрощенно, метод рендеринга сцены может выглядеть так:
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());
}
Действительно упрощенный, вам все равно придется, например, применять ротацию и перевод в зависимости от того, где находится ваш игрок и куда он смотрит. (Мой пример - 3D-игра, если вы пойдете с 2D, это будет прогулка в парке).
Надеюсь, это то, что вы искали? Как можно вспомнить из вышесказанного, система рендеринга не заботится о логике игры . Он использует только текущее состояние сцены для рендеринга, то есть извлекает из него необходимую информацию для рендеринга. А логика игры? Неважно, что делает рендерер. Черт, все равно, отображается ли он вообще!
И вам не нужно прикреплять информацию рендеринга к сцене. Этого должно быть достаточно, чтобы визуализатор знал, что ему нужно визуализировать орка. Вы уже загрузили модель орка, которую рендер будет знать для отображения.
Это должно удовлетворить ваши требования. Графическое представление и логика связаны , потому что они оба используют одни и те же данные. Все же они отделены , потому что ни один не полагается на другого!
РЕДАКТИРОВАТЬ: И просто чтобы ответить, почему кто-то сделал бы это так? Потому что это проще, это самая простая причина. Вам не нужно думать о том, "что-то и такое произошло, теперь я должен обновить графику". Вместо этого вы заставляете вещи происходить, и каждый кадр игры смотрит на то, что происходит в данный момент, и интерпретирует это некоторым образом, давая вам результат на экране.