Припустимо, у вас є сцена, складена зі світу , гравця та боса. О, це гра третьої особи, тож у вас також є камера .
Тож ваша сцена виглядає приблизно так:
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::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, це буде прогулянка по парку).
Я сподіваюся, що це те, що ви шукали? Як ви можете сподіватися згадати вищесказане, система візуалізації не піклується про логіку гри . Він використовує лише поточний стан сцени для візуалізації, тобто витягує з нього необхідну інформацію для того, щоб відобразити. А логіка гри? Байдуже, що робить рендер. Чорт забирай, байдуже, чи відображається він взагалі!
І вам також не потрібно прикріплювати інформацію про надання на сцені. Повинно бути достатньо, щоб рендер знав, що йому потрібно видати орка. Ви вже завантажили модель орків, яку рендер тоді знає відображати.
Це повинно відповідати вашим вимогам. Графічне зображення та логіка поєднані , оскільки вони обидва використовують однакові дані. І все ж вони є окремими , бо ні на кого не покладається!
EDIT: І просто відповісти, чому хтось зробив би це так? Тому що це легше - це найпростіша причина. Вам не потрібно думати про "таке і таке сталося, я зараз повинен оновлювати графіку". Натомість ви робите речі, і кожен кадр гри дивиться на те, що зараз відбувається, і певним чином інтерпретує це, даючи на екрані результат.