월드 , 플레이어 및 보스 로 구성된 장면 이 있다고 가정합니다 .아, 이것은 3 인칭 게임이므로 카메라 도 있습니다 .
장면은 다음과 같습니다.
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로 가면 공원에서 산책 할 것입니다).
이것이 당신이 찾고있는 것이기를 바랍니다. 위의 내용에서 바라본대로 렌더링 시스템 은 게임의 논리에 신경 쓰지 않습니다 . 장면의 현재 상태 만 사용하여 렌더링합니다. 즉 렌더링하기 위해 필요한 정보를 가져옵니다. 그리고 게임 로직? 렌더러의 기능은 중요하지 않습니다. 도대체 전혀 표시되지 않습니다!
렌더링 정보를 장면에 첨부 할 필요도 없습니다. 렌더러가 오크를 렌더링해야한다는 것을 알고 있으면 충분합니다. 렌더러가 표시 할 것으로 알고있는 오크 모델을 이미로드했습니다.
요구 사항을 충족해야합니다. 그래픽 표현과 논리 는 모두 동일한 데이터를 사용하기 때문에 결합 됩니다. 그러나 그들은 별개입니다 둘 다 서로 의존하지 않기 때문에 !
편집 : 그리고 왜 이런 식 으로 대답 할까요? 가장 쉬운 이유는 가장 쉬운 이유입니다. "그런데 그런 일이 생겼으니 이제 그래픽을 업데이트해야합니다." 대신, 당신은 일을하고, 게임의 각 프레임은 현재 일어나고있는 것을보고 어떤 방식으로 해석하여 화면상의 결과를 제공합니다.