Giả sử bạn có một cảnh bao gồm một thế giới , một người chơi và một ông chủ. Ồ, và đây là trò chơi của người thứ ba, vì vậy bạn cũng có một máy ảnh .
Vì vậy, cảnh của bạn trông như thế này:
class Scene {
World* world
Player* player
Enemy* boss
Camera* camera
}
(Ít nhất, đó là dữ liệu cơ bản . Cách bạn chứa dữ liệu, tùy thuộc vào bạn.)
Bạn chỉ muốn cập nhật và kết xuất cảnh khi bạn đang chơi trò chơi, không phải khi bị tạm dừng hoặc trong menu chính ... vì vậy bạn gắn nó vào trạng thái trò chơi!
State* gameState = new State();
gameState->addScene(scene);
Bây giờ trạng thái trò chơi của bạn có một cảnh. Tiếp theo, bạn muốn chạy logic trên cảnh và kết xuất cảnh. Đối với logic, bạn chỉ cần chạy một chức năng cập nhật.
State::update(double delta) {
scene->update(delta);
}
Bằng cách đó bạn có thể giữ tất cả logic trò chơi trong Scene
lớp. Và chỉ để tham khảo, một hệ thống thành phần thực thể có thể làm điều đó như thế này:
State::update(double delta) {
physicsSystem->applyPhysics(scene);
}
Dù sao, bây giờ bạn đã quản lý để cập nhật cảnh của bạn. Bây giờ bạn muốn hiển thị nó! Mà chúng tôi làm một cái gì đó tương tự như trên:
State::render() {
renderSystem->render(scene);
}
Có bạn đi. Hệ thống renderS đọc thông tin từ cảnh và hiển thị hình ảnh phù hợp. Đơn giản hóa, phương thức hiển thị cảnh có thể trông như thế này:
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());
}
Thực sự đơn giản, bạn vẫn cần, ví dụ, áp dụng xoay và dịch dựa trên vị trí của người chơi của bạn và nơi anh ấy đang tìm kiếm. (Ví dụ của tôi là một trò chơi 3D, nếu bạn chơi 2D, thì đó sẽ là một cuộc dạo chơi trong công viên).
Tôi hy vọng đó là điều mà bạn đang tìm kiếm? Như bạn có thể hy vọng hồi tưởng từ những điều trên, hệ thống kết xuất không quan tâm đến logic của trò chơi . Nó chỉ sử dụng trạng thái hiện tại của cảnh để kết xuất, tức là nó lấy thông tin cần thiết từ nó, để hiển thị. Còn logic trò chơi? Nó không quan tâm những gì trình kết xuất làm. Heck, nó không quan tâm nếu nó hiển thị ở tất cả!
Và bạn cũng không cần phải đính kèm thông tin kết xuất vào cảnh. Nó phải đủ để trình kết xuất biết rằng nó cần kết xuất một con Orc. Bạn đã tải một mô hình orc rồi, mà trình kết xuất sau đó biết để hiển thị.
Điều này sẽ đáp ứng yêu cầu của bạn. Biểu diễn đồ họa và logic được ghép nối , bởi vì cả hai đều sử dụng cùng một dữ liệu. Tuy nhiên, họ là riêng biệt , bởi vì không dựa vào nhau!
EDIT: Và chỉ để trả lời tại sao một người sẽ làm điều đó như thế này? Bởi vì nó dễ dàng hơn là lý do đơn giản nhất. Bạn không cần phải suy nghĩ về "chuyện như vậy và đã xảy ra, giờ tôi nên cập nhật đồ họa". Thay vào đó, bạn biến mọi thứ thành hiện thực và mỗi khung hình trò chơi sẽ xem xét những gì đang diễn ra và diễn giải nó theo một cách nào đó, mang lại cho bạn kết quả trên màn hình.