Port mesin Anda ke setiap platform. Tidak ada yang istimewa tentang itu. Jika Anda memiliki beberapa kode yang hanya Windows, maka tambahkan beberapa logika #ifdef dalam file atau tambahkan file kedua (sehingga Anda akan memiliki FooWindows.cpp
dan FooLinux.cpp
atau apa pun) yang mengimplementasikan fitur itu pada OS lain yang Anda pedulikan .
Publikasi sekali klik mempublikasikan bahwa mesin seperti Unity diizinkan karena Unity sendiri tidak pernah dimodifikasi oleh pengguna akhir. Anda hanya menulis skrip dan data, sehingga mesin memiliki binari pra-dibangun untuk semua platform dan tombol publikasikan hanya menggabungkan binari-binari tersebut bersama dengan data.
Mesin lain mengandalkan sistem build dan cross-compiler untuk membuat game yang dikompilasi saat dibutuhkan, seperti yang akan Anda lakukan dengan aplikasi lintas-platform non-game.
Untuk hal-hal seperti HTML5, ada alat seperti emscripten yang dapat mengkompilasi aplikasi C ++ untuk dijalankan dalam JavaScript. Anda pada dasarnya hanya perlu membuat port lain dari mesin Anda untuk emscripten (karena tidak dapat menggunakan pustaka C ++ yang sewenang-wenang).
Anda tidak harus menulis ulang seluruh permainan, tetapi Anda harus melakukan banyak pengembangan, pengkodean, dan pekerjaan porting untuk setiap platform baru yang ingin Anda dukung.
share/os/<linux>
(ataushare/cpu/x86
) dan meletakkan semua kode spesifik platform di sana dan kemudian melakukan termasuk bersyarat. Setidaknya itulah yang dilakukan gcc, HotSpot, dan kernel Linux (bukan aturan yang sulit). Ya, Anda dapat mulai dengan hanya satu fungsi yang bergantung pada platform dan berpikir itu berlebihan tetapi tidak pernah tetap seperti itu dan menjadi berantakan dengan cepat jika tidak.Tidak ada peluru ajaib di sini. Jika Anda ingin permainan Anda berjalan di beberapa platform, Anda harus menulis kode untuk beberapa platform (atau memanfaatkan perpustakaan pihak ketiga yang sudah melakukan ini untuk Anda).
Hal-hal yang Anda minta tidak selaras: Anda katakan (beri penekanan pada saya)
tetapi juga itu (tekankan lagi)
Anda cukup banyak harus melakukan satu atau yang lain: memilih untuk menggunakan perpustakaan pihak ketiga, mesin dan / atau rantai alat yang menyediakan dukungan lintas-platform untuk Anda, atau membangun sendiri dengan menulis kode lintas-platform (mendesain Anda miliki abstraksi atas platform yang tersedia untuk Anda, dan implementasikan abstraksi itu untuk setiap platform).
Mesin permainan seperti Unreal atau Unity yang mendukung ini mengkompilasi ulang kode Anda terhadap abstraksi platform yang sesuai, atau mengharuskan Anda untuk membangun pustaka atau DLL terhadap API internal mereka, yang mereka muat dari driver khusus platform yang dapat dieksekusi yang telah mereka kompilasi untuk yang sesuai peron.
sumber
Bertentangan dengan dua jawaban lainnya (yang memang seharusnya C ++ - spesifik), ada cara lain. Beberapa arsitektur yang muncul di pikiran:
Secara pribadi, saya menemukan pendekatan libGDX adalah yang paling sederhana: temukan bahasa atau platform yang memenuhi kebutuhan Anda, dan tulis di atas. Pembuatan kode dan mesin portabel rumit dan sulit untuk ditulis dengan baik.
libGDX sebenarnya adalah pilihan yang bagus, karena hits baik ponsel besar, desktop, dan web (melalui applet atau kompiler web Google).
sumber
Saya sedang membangun mesin permainan lintas-platform saat ini. Saya menggunakan SDL, yang merupakan pustaka lintas-platform yang sangat baik (dan level rendah) untuk membangun aplikasi grafis, untuk mengurangi rasa sakit.
Selain itu, banyak "kode khusus" untuk setiap platform. Ini Anda hanya harus melewati. Saya telah menemukan ini sebagai bagian yang sangat kecil dari waktu pengembangan saya sejauh ini, kebanyakan menghabiskan waktu mencari dokumen untuk sistem yang saya tidak terbiasa dengan Linux asli saya.
Saya akan mencegah Anda menggunakan
#ifdef
mana-mana di seluruh kode Anda. Sebagai gantinya, buat abstraksi di sekitar primitif kunci (contoh primitif semacam itu mungkin soket TCP).Ketika Anda menemukan masalah baru yang membutuhkan solusi berbeda per-lingkungan, tanyakan pada diri sendiri "bisakah saya menyelesaikan masalah ini hanya dengan menggunakan cross-platform primitif yang telah saya buat?" Jika jawabannya adalah ya: voila, kode lintas-platform sederhana. Jika tidak, cari tahu primitif apa yang Anda lewatkan dan terapkan.
sumber
Jika Anda ingin melakukan ini "dari awal" sebagai pengalaman belajar maka Anda harus menggunakan Win32 API di mana Anda dapat menemukan informasi tentang membuka jendela dan konteks OpenGL pada MSDN dan pada wiki OpenGL ( http: // www .opengl.org / wiki / Creating_an_OpenGL_Context_ (WGL) ). Untuk Linux, dapatkan salinan kedua dari Manual Pemrograman O'Reilly Xlib dan Manual Referensi Xlib dan baca juga di GLX (OpenGL Extension to the X Window System). Lihat juga http://www.opengl.org/wiki/Tutorial:_OpenGL_3.0_Context_Creation_(GLX)
Maka Anda hanya perlu memberikan API yang sama ke aplikasi Anda dengan fungsi yang melakukan hal yang sama (misalnya membuka jendela) tetapi memiliki implementasi yang berbeda untuk setiap platform. Anda menulis ulang bagian-bagian mesin Anda untuk platform yang berbeda. Kemudian gim yang Anda tulis menggunakan mesin Anda hanya perlu menulis sekali tetapi gim ini akan bekerja pada platform yang berbeda.
sumber