Saya mengkodekan permainan beat 'up mereka di C ++ dan sudah tiba saatnya untuk mengimplementasikan scripting untuk acara, pemicu, cutscenes dll. Saya telah membaca di internet dan mendapatkan sedikit informasi. Solusi pilihan pertama saya adalah mengimplementasikan bahasa skrip saya sendiri seperti yang ada di Cave Story . Saya telah melihat ini disarankan tetapi kebanyakan poaple menyarankan lua tetapi sepertinya tidak cocok dengan jenis pemrograman saya.
Sudahkah Anda membuat bahasa skrip Anda sendiri? Mengapa Anda memilih untuk menggulung sendiri daripada menggunakan yang sudah ada? Sumber daya apa yang Anda konsultasikan selama pengembangan?
Jawaban:
No Setidaknya, mungkin tidak.
Ini adalah kasus yang sangat sering ditemukan menciptakan kembali pengembangan game, kesalahan yang masih cukup populer.
Jika Anda mengajukan pertanyaan ini, kemungkinan besar Anda akan dipengaruhi oleh apa yang dilakukan orang lain, jadi lihat saja apa yang baru saja dilakukan Epic Games dengan Unreal Engine:
Apakah Anda pikir Anda bisa melakukan lebih baik daripada Epic?
Membuat bahasa pemrograman adalah milik pembuat bahasa pemrograman , bukan insinyur game.
Butuh bertahun-tahun untuk sebuah bahasa menjadi sepenuhnya matang, dan toolset yang menyertainya (compiler, linker, interpreter, debugger ..) dapat digunakan. Saat ini Anda memiliki banyak solusi yang tersedia sehingga sama sekali tidak ada alasan nyata untuk memulai hal baru dari awal, setidaknya tidak jika tujuannya hanya untuk membuat permainan. Periode.
Untuk menjawab pertanyaan sampingan Anda, tidak, karena alasan ini saya tidak pernah menerapkan bahasa skrip saya sendiri. Tapi saya sudah banyak menderita dengan yang setengah matang. Karena mereka diciptakan dengan fitur yang sangat sempit dalam pikiran, mereka selalu memiliki kebiasaan aneh kecil yang membuat Anda gila. Seringkali, Anda akan menghabiskan banyak waktu hanya untuk mengatasi keterbatasan bahasa alih-alih membuat game saja.
Jika alasan Anda ingin membuat bahasa adalah karena itu dimaksudkan untuk digunakan oleh orang-orang yang tidak mengerti pemrograman dengan baik, atau jika Anda yakin Anda membutuhkannya karena Anda menginginkan sesuatu yang sangat spesifik untuk domain, izinkan saya memberi tahu Anda bahwa ini juga alasan buruk. Anda dapat menulis API tingkat sangat tinggi dengan fungsi-fungsi itu
do_what_they_say_and_say_what_they_do()
, dan beberapa kode boilerplate yang sangat sederhana yang memperlihatkan penggunaan dasarnya. Pengguna yang tidak terlalu teknis akan senang mempelajari sedikit pemrograman, dan Anda akan senang tidak dibatasi oleh beberapa bahasa yang diimplementasikan dengan buruk.Jadi, karena ini akan terdengar tiba-tiba sedikit atau bahkan kasar, saya akan mengatakan bahwa ada satu kasus di mana itu bisa masuk akal: jika Anda ingin belajar bagaimana bahasa scripting dibuat. Tapi tolong, tolong, jika Anda melakukannya: jangan memaksa orang lain untuk menggunakannya.
Edit
Saya baru saja melihat daftar perintah Cave Story yang telah Anda tautkan. Aduh:
Saya tidak ingin menunjukkan rasa tidak hormat kepada pengembang di balik Cave Story, tetapi ini adalah contoh sempurna dari daftar perintah sederhana yang bermutasi dalam bahasa skrip kustom yang tidak terkendali. Ini mungkin masih dapat digunakan untuk pengembang tunggal atau tim yang sangat kecil, tetapi pada tahap ini saya menyarankan untuk beralih ke bahasa Turing-lengkap dan dicoba dengan baik (misalnya Lua), di mana Anda dapat melakukan:
Ini akan membuat segalanya jauh lebih mudah ketika, misalnya, Anda akan memerlukan kondisi yang lebih kompleks:
sumber
Saya sudah, meskipun saya meminjam sintaks dari bahasa lain. Semua dalam semua itu adalah pengalaman belajar yang hebat dan dalam kasus saya tidak terlalu sulit karena bahasanya sederhana.
Saya melakukannya terutama karena saya ingin menggunakan sintaks C-style biasa untuk skrip saya, karena semua orang di tim terbiasa dengan itu.
Saya juga tertarik untuk belajar sedikit tentang menerapkan bahasa pemrograman, dan karena saya hanya membutuhkan subset fitur yang sangat sederhana (variabel, aritmatika, kondisional, loop, dan memanggil fungsi-fungsi permainan atau coroutine), saya memutuskan untuk mencobanya.
Sumber utama saya adalah buku ini:
Saya berhasil belajar cukup banyak dari buku ini untuk diimplementasikan:
Saya akan berhenti di sana karena hampir semua yang saya butuhkan sudah berfungsi, kecuali untuk satu hal - memanggil dan menghasilkan coroutine Unity3D jauh dari dalam interpreter rekursif. Untuk mengatasi masalah itu, saya harus menyingkirkan rekursi, dan sekali lagi beralih ke buku. Kali ini saya akhirnya menambahkan:
Seluruh proses memakan waktu sekitar 2 minggu dari nol pengetahuan, dan sangat menyenangkan :)
PS: Pada akhirnya saya juga ingin menambahkan highlight sintaksis dan intellisense untuk bahasa kustom saya pada alat kami. Scintilla adalah penyelamat dalam hal ini. Saya menggunakan pembungkus berikut:
http://scintillanet.codeplex.com/
sumber
OK, mari kita coba ini dari sudut yang berbeda: ada apa dengan Lua yang tidak kamu sukai? Apakah itu sesuatu yang mudah diperbaiki, atau itu sesuatu yang mendasar?
Misalnya, gunakan kata kunci seperti
then/do/end
untuk menunjukkan blok kode daripada kurung kurawal gaya C / C ++ yang bagus. Jika itu masalah Anda ... itu sesuatu yang bisa Anda perbaiki. Yang perlu Anda lakukan adalah mendefinisikan dialek kecil Lua Anda sendiri, dan menulis alat transformasi sederhana yang akan mengubah sintaks kurung kurawal menjadi Lua yang sebenarnya.Apakah Anda ingin + = dalam beberapa bentuk? Itu juga hal mudah yang dapat Anda lakukan dalam sistem pra-pemrosesan. Cukup ubah pernyataan formulir
expr1 += expr2
menjadiexpr1 = expr1 + expr2
.Memang, Anda harus menemukan cara untuk mendeteksi apakah sepasang kurung kurawal mewakili sebuah tabel atau
do/end
pasangan. Dan Anda harus menghubungkan sistem pre-processing Anda ke Lua dengan menimpadofile
,loadstring
dan fungsi perpustakaan Lua standar lainnya. Tapi itu semua akhirnya bisa dilakukan.Jika masalah kecil seperti itu menjadi perhatian Anda, dan Anda terlalu terikat pada satu gaya pemrograman untuk hanya mengubah cara Anda kode (catatan: ini umumnya kualitas yang buruk untuk dimiliki sebagai seorang programmer), ini adalah alternatif yang jauh lebih layak daripada sekadar menulis bahasa Anda sendiri. Ini akan mengambil mungkin beberapa minggu paling banyak . Bandingkan dengan tahun - tahun yang akan dihabiskan pada bahasa yang tepat, dengan dukungan debug yang kaya dan sejenisnya.
Jika masalah Anda lebih besar dari ini (global adalah standarnya, sehingga mengharuskan Anda untuk menggunakannya di
local
mana saja), beberapa di antaranya dapat dikelola (cukup membuat menyatakan kesalahan global baru, melalui penggunaan lingkungan dan metatabel yang diubah). Jika Anda membenci fungsi sebagai objek kelas satu, coroutine, pengumpulan sampah, atau elemen dasar Lua lainnya ... yah, Anda sedang berada di neraka buatan Anda sendiri;)Dan jika Anda benar- benar ingin menjadi hardcore tentang hal itu, Anda dapat menulis bahasa Anda sendiri yang Anda kompilasi ke dalam Lua. Jadi Anda setidaknya dapat memanfaatkan runtime Lua yang sangat teruji, API Lua yang luar biasa, dan fasilitas Lua dasar lainnya, semuanya dari bahasa Lua Anda! Ini akan memakan waktu, tetapi itu masih belum bertahun - tahun bahwa Anda akan menghabiskan sesuatu yang lain.
sumber
Untuk melengkapi jawaban lain, ini bukan opsi biner. Dalam bahasa skrip yang ada, Anda juga dapat membuat Domain-specific_language Anda sendiri . Keuntungan dari pendekatan ini adalah:
Kerugian utama adalah bahwa Anda akan merancang DSL dengan kendala bahasa "dasar" Anda.
sumber
Ini mungkin masuk akal tergantung pada mekanisme permainan Anda. Beberapa game dengan mekanisme yang cukup sederhana dapat menggunakan bahasa yang ditafsirkan untuk menyelamatkan diri dari beberapa pengkodean Lua / Python yang terlalu rumit, tetapi penghematan kompleksitas mungkin tidak terlalu berharga. Misalnya, salah satu game Interactive Novel itu dapat dengan mudah menggunakan mesin skrip yang ditulis khusus.
Jika gim Anda melibatkan mesin fisika, berbagai komponen gim, dan beragam kompleksitas karakter dan kemampuan, Anda harus mempertimbangkan untuk melihat bahasa skrip lain yang ada, sehingga Anda tidak terburu-buru untuk menambahkan fitur-fitur yang diperlukan ke kustom Anda, atau memperbaiki bug dengan saya t. Walaupun Lua kemungkinan besar adalah yang tercepat, ada banyak lainnya yang mungkin Anda sukai untuk sintaksanya, dan banyak dari mereka yang membual tentang betapa mudahnya mereka berintegrasi dengan C. Python, Ruby, dan Angelscript. (Jangan ragu untuk menyebutkan orang lain di komentar)
Jika Anda memastikan bahasa tersebut hanya digunakan untuk "kontrol logika" (yaitu menangani kasus tabrakan spesifik untuk jenis objek tertentu, seperti nyala api yang menyentuh balok es) maka kinerja hampir tidak akan pernah menjadi masalah. Tentu saja, di sisi lain, jika Anda menggunakannya untuk lebih banyak kode rutin (membuat algoritme pemeriksaan tabrakan khusus yang menjalankan setiap frame), kemungkinan besar akan menghambat Anda.
sumber
Saya katakan, lakukanlah. Pada resume itu akan menunjukkan kemampuan ekstra. Padahal, perlu diingat, Anda membutuhkan kemampuan itu terlebih dahulu. Itu tidak akan mudah, itu akan sangat sulit. Ada buku tentang hal itu, dan tutorial online juga, tetapi pada akhirnya itu akan turun kepada Anda dan pemahaman Anda tentang bagaimana kompiler bekerja, dan bagaimana kode diurai dan diterjemahkan.
Pastikan Anda memulai dengan sederhana, uji sering, dan pertahankan cita-cita Anda. Tapi selalu ingat, LUA ada untuk Anda.
sumber