Saya punya pertanyaan tentang arsitektur game: Apa cara terbaik untuk memiliki komponen yang berbeda berkomunikasi satu sama lain?
Saya benar-benar minta maaf jika pertanyaan ini telah ditanyakan sejuta kali, tetapi saya tidak dapat menemukan apa pun dengan informasi yang saya cari.
Saya telah mencoba untuk membangun game dari awal (C ++ jika itu penting) dan telah mengamati beberapa perangkat lunak game open source untuk inspirasi (Super Maryo Chronicles, OpenTTD dan lainnya). Saya perhatikan bahwa banyak dari desain game ini menggunakan instance global dan / atau lajang di semua tempat (untuk hal-hal seperti render antrian, manajer entitas, manajer video, dan sebagainya). Saya mencoba menghindari contoh global dan lajang dan membangun sebuah mesin yang longgar mungkin, tapi saya memukul beberapa kendala yang berutang kepada pengalaman saya dalam desain yang efektif. (Bagian dari motivasi untuk proyek ini adalah untuk mengatasi ini :))
Saya telah membangun desain di mana saya memiliki satu GameCore
objek utama yang memiliki anggota yang analog dengan contoh global yang saya lihat dalam proyek lain (yaitu, ia memiliki manajer input, manajer video, GameStage
objek yang mengontrol semua entitas dan permainan game untuk tahap apa pun yang sedang dimuat, dll). Masalahnya adalah karena semuanya terpusat pada GameCore
objek, saya tidak memiliki cara mudah untuk komponen yang berbeda untuk berkomunikasi satu sama lain.
Melihat Super Maryo Chronicles, misalnya, setiap kali komponen permainan perlu berkomunikasi dengan komponen lain (yaitu, objek musuh ingin menambahkan dirinya ke antrian render untuk ditarik dalam tahap render), itu hanya berbicara kepada contoh global.
Bagi saya, saya harus membuat objek permainan saya meneruskan informasi yang relevan kembali ke GameCore
objek tersebut, sehingga GameCore
objek tersebut dapat meneruskan informasi itu ke komponen lain dari sistem yang membutuhkannya (yaitu: untuk situasi di atas, setiap objek musuh akan meneruskan informasi render mereka kembali ke GameStage
objek, yang akan mengumpulkan semuanya dan meneruskannya kembali GameCore
, yang pada gilirannya akan meneruskannya ke pengelola video untuk rendering). Ini terasa seperti desain yang benar-benar mengerikan, dan saya mencoba memikirkan resolusi untuk ini. Pikiranku tentang kemungkinan desain:
- Mesin virtual global (desain Super Maryo Chronicles, OpenTTD, dll)
- Memiliki
GameCore
objek bertindak sebagai perantara di mana semua objek berkomunikasi (desain saat ini dijelaskan di atas) - Berikan pointer komponen ke semua komponen lain yang perlu mereka bicarakan (yaitu, dalam contoh Maryo di atas, kelas musuh akan memiliki pointer ke objek video yang perlu diajak bicara)
- Break game menjadi subsistem - Misalnya, memiliki objek manajer di
GameCore
objek yang menangani komunikasi antara objek di subsistem mereka - (Pilihan lain? ....)
Saya membayangkan opsi 4 di atas untuk menjadi solusi terbaik, tetapi saya mengalami masalah dalam mendesainnya ... mungkin karena saya telah berpikir dalam hal desain yang saya lihat menggunakan global. Rasanya seperti saya mengambil masalah yang sama yang ada dalam desain saya saat ini dan mereplikasi di setiap subsistem, hanya pada skala yang lebih kecil. Sebagai contoh, GameStage
objek yang dijelaskan di atas agak merupakan upaya ini, tetapi GameCore
objek masih terlibat dalam proses.
Adakah yang bisa menawarkan saran desain di sini?
Terima kasih!