สมมติว่าคุณมีฉากประกอบของโลกเป็นผู้เล่นและเจ้านาย โอ้และนี่เป็นเกมบุคคลที่สามดังนั้นคุณจึงมีกล้องถ่ายรูปด้วย
ดังนั้นฉากของคุณจะเป็นดังนี้:
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());
}
ง่ายขึ้นจริง ๆ คุณยังจำเป็นต้องใช้การหมุนและการแปลตามตำแหน่งที่เครื่องเล่นของคุณอยู่และตำแหน่งที่เขามอง (ตัวอย่างของฉันคือเกม 3 มิติถ้าคุณไปกับ 2D มันจะเป็นการเดินเล่นในสวนสาธารณะ)
ฉันหวังว่านี่คือสิ่งที่คุณกำลังมองหา? ในขณะที่คุณหวังว่าจะสามารถจำจากด้านบนระบบทำให้ไม่สนใจเกี่ยวกับตรรกะของเกม มันใช้สถานะปัจจุบันของฉากเท่านั้นในการเรนเดอร์นั่นคือดึงข้อมูลที่จำเป็นจากมันเพื่อทำการเรนเดอร์ และตรรกะของเกม? มันไม่สนใจว่าตัวเรนเดอร์ทำอะไร เฮ้มันไม่สนใจเลยถ้ามันจะแสดงออกมาเลย!
และคุณไม่จำเป็นต้องแนบข้อมูลการแสดงผลกับฉากเช่นกัน มันควรจะเพียงพอที่ตัวเรนเดอร์รู้ว่าจำเป็นต้องเรนเดอร์ orc คุณจะโหลดโมเดล orc เรียบร้อยแล้วซึ่งโหมดแสดงภาพจะรู้ว่าจะแสดงได้อย่างไร
สิ่งนี้ควรตอบสนองความต้องการของคุณ การแสดงกราฟิกและตรรกะนั้นเชื่อมโยงกันเพราะทั้งคู่ใช้ข้อมูลเดียวกัน พวกเขาแยกจากกันเพราะไม่ต้องพึ่งพาคนอื่น!
แก้ไข: และเพียงเพื่อตอบว่าทำไมจะทำเช่นนี้? เพราะง่ายกว่านั้นคือเหตุผลที่ง่ายที่สุด คุณไม่จำเป็นต้องคิดเกี่ยวกับ "เช่นนั้นเกิดขึ้นตอนนี้ฉันควรปรับปรุงกราฟิก" แต่คุณทำสิ่งต่าง ๆ และแต่ละเฟรมเกมจะดูว่าเกิดอะไรขึ้นในขณะนั้นและตีความมันในบางวิธีทำให้คุณเห็นผลลัพธ์บนหน้าจอ