Saya sedang membangun mesin permainan sederhana dan permainan di dalamnya. Idenya adalah untuk mengimplementasikan sebagian besar fungsionalitas dan hierarki kelas dasar di mesin yang seharusnya berupa exe dan kemudian memiliki dll yang akan mengimplementasikan permainan tertentu dengan alat yang disediakan mesin. Mirip dengan mesin id seperti idTech4.
Mesin kemudian akan memuat dll, memperoleh instance game, memberikan petunjuk game ke fungsi dan struktur data apa pun yang dibutuhkan game, dan memanggil metode seperti game->update();
pada instance game. Sejauh ini bagus.
Saya ingin hal-hal seperti kelas dasar seperti Entity, Transform, Vector3 dll diimplementasikan di mesin. Lalu di dalam game yang saya inginkan misalnya mendapatkan karakter saya dari Entity.
class Character : public engine::Entity {...};
Hal-hal seperti ini dikompilasi dengan baik karena saya menyertakan header dari mesin tetapi tidak tertaut karena saya tidak menggunakan file obj atau file cpp dari mesin. Saya tahu mengapa ini tidak berhasil. Sejauh yang saya tahu, pilihan saya (yang masuk akal) adalah:
- Jadikan kelas-kelas ini hanya sebagai header - dengan cara ini ia akan selalu dikompilasi di mana saja.
Saya tidak menginginkan ini karena akan menambah waktu kompilasi, ukuran biner, dll.
- Masukkan fungsionalitas umum ke dalam lib atau dll.
Ini akan berhasil, tetapi file lib berarti saya memiliki kelas yang sama yang dikompilasi (ditautkan) baik di exe (mesin) dan dll (permainan) - ini tampaknya ceroboh. Dll akan berfungsi tetapi sepertinya banyak pekerjaan dengan semua ekspor dan impor yang perlu saya lakukan pada mesin dan game. Mungkin juga yang paling penting pendekatan lib dan dll memiliki masalah yang sama yaitu selama pengembangan saya mungkin akan sering berpindah-pindah kelas dari dan ke kelas tersebut karena hierarki kelas mungkin banyak berubah, dll.
Pertanyaan saya adalah, apakah ada cara lain untuk mengatasi hal ini? Bagi saya ini sepertinya fitur yang cukup berguna untuk memiliki hierarki kelas dalam exe yang dapat digunakan dari dll. Saya bahkan mencoba hal yang sangat konyol seperti membuat linker menggunakan file .obj yang dihasilkan selama kompilasi mesin, tetapi tidak berhasil kecuali saya menentukan semua file .obj satu per satu (Saya menggunakan Visual Studio 2017).
Saya tidak ingin melepaskan modularitas desain ini.
Edit: Karena dll bersifat khusus platform, mari kita pertimbangkan Windows (walaupun menurut saya platform lain akan serupa).