Misalkan Anda memiliki adegan yang terdiri dari dunia , pemain , dan bos. Oh, dan ini adalah permainan orang ketiga, jadi Anda juga memiliki kamera .
Jadi adegan Anda terlihat seperti ini:
class Scene {
World* world
Player* player
Enemy* boss
Camera* camera
}
(Setidaknya, itulah data dasar . Bagaimana Anda menyimpan data, terserah Anda.)
Anda hanya ingin memperbarui dan membuat adegan ketika Anda memainkan game, bukan ketika dijeda, atau di menu utama ... sehingga Anda melampirkannya ke status permainan!
State* gameState = new State();
gameState->addScene(scene);
Sekarang kondisi permainan Anda memiliki heboh. Selanjutnya, Anda ingin menjalankan logika di tempat kejadian, dan membuat adegan. Untuk logika, Anda hanya menjalankan fungsi pembaruan.
State::update(double delta) {
scene->update(delta);
}
Dengan begitu Anda bisa menyimpan semua logika game di Scene
kelas. Dan hanya untuk referensi, sistem komponen entitas dapat melakukannya seperti ini sebagai gantinya:
State::update(double delta) {
physicsSystem->applyPhysics(scene);
}
Ngomong-ngomong, kini Anda berhasil memperbarui adegan Anda. Sekarang Anda ingin menampilkannya! Untuk itu kami melakukan sesuatu yang mirip dengan di atas:
State::render() {
renderSystem->render(scene);
}
Ini dia. Sistem render membaca informasi dari tempat kejadian, dan menampilkan gambar yang sesuai. Sederhana, metode untuk rendering adegan mungkin terlihat seperti ini:
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());
}
Sangat sederhana, Anda masih perlu, misalnya, menerapkan rotasi dan terjemahan berdasarkan di mana pemain Anda berada dan di mana dia melihat. (Contoh saya adalah game 3D, jika Anda menggunakan 2D, itu akan menjadi jalan-jalan di taman).
Saya harap ini yang Anda cari? Seperti yang mudah-mudahan dapat Anda ingat dari hal di atas, sistem render tidak peduli dengan logika permainan . Itu hanya menggunakan keadaan saat ini adegan untuk membuat, yaitu itu menarik informasi yang diperlukan darinya, untuk membuat. Dan logika game? Tidak peduli apa yang dilakukan penyaji. Heck, tidak peduli apakah itu ditampilkan sama sekali!
Dan Anda tidak perlu melampirkan informasi render ke tempat kejadian juga. Seharusnya cukup bahwa pemberi render tahu perlu membuat sebuah orc. Anda sudah memuat model orc, yang kemudian ditampilkan oleh renderer untuk ditampilkan.
Ini harus memenuhi persyaratan Anda. Representasi grafis dan logika digabungkan , karena keduanya menggunakan data yang sama. Namun mereka terpisah , karena tidak ada yang bergantung pada yang lain!
EDIT: Dan hanya untuk menjawab mengapa orang melakukannya seperti ini? Karena lebih mudah adalah alasan paling sederhana. Anda tidak perlu memikirkan "ini dan itu terjadi, sekarang saya harus memperbarui grafik". Alih-alih Anda membuat hal-hal terjadi, dan setiap bingkai permainan melihat apa yang sedang terjadi, dan menafsirkannya dengan cara tertentu, memberi Anda hasil di layar.