Ada beberapa gim yang memungkinkan pemain untuk menulis / membuat skrip dalam gim, misalnya: Insinyur ruang angkasa atau Psi .
Saya ingin menggunakan sesuatu yang mirip dengan salah satunya, tetapi saya kesulitan menemukan informasi sehingga pertanyaan saya adalah:
Apakah ada cabang pemrograman yang mencakup kemampuan suatu perangkat lunak yang pernah dikompilasi untuk menjalankan kode baru yang dibuat oleh pengguna?
Dengan cabang pemrograman saya maksudkan sesuatu seperti PTG (Prosedural Terrain Generation).
Untuk menghindari pertanyaan atau pendapat yang terlalu luas , izinkan saya dengan jelas menyatakan bahwa saya tidak mencari panduan atau tempat untuk belajar, saya ingin nama atau definisi (jika ada) dari teknologi yang terlibat.
scripting
terminology
Westside Tony
sumber
sumber
Jawaban:
Skrip yang ditulis dalam bahasa scripting / tertanam / ditafsirkan seperti "Lua", "Lisp" atau "AngelScript" ( lebih lanjut di sini ) dapat diperbarui selama game [*] dan kemudian ditafsirkan (= dieksekusi) dengan cepat.
Anda bisa mengikat elemen-elemen dari skrip-skrip tersebut ke kode kompilasi asli Anda (C ++, dll.) Sehingga skrip kemudian dapat menjalankan logika dari aplikasi Anda. E. g. perintah khusus yang dapat dimasukkan pengguna dalam skrip, sebagai hasilnya memindahkan karakter dalam game dengan jarak tertentu di dunia game.
Beberapa pertanyaan terkait yang relevan:
Bahasa scripting apa yang harus saya pilih untuk game saya?
Apa yang Anda cari dalam bahasa scripting?
Bagaimana Anda menambahkan bahasa scripting ke game?
[*] baik oleh pengguna sebagai bagian dari permainan game atau juga oleh pengembang untuk pengulangan / pengujian cepat tanpa memulai ulang aplikasi
sumber
interpreted
klasisifikasi yang baik; kami memberi tahu OP yang tidak mengetahui fakta ini bahwa bahasa tidak perlu dikompilasi, tetapi dapat ditafsirkan - dan kami memberikan beberapa bahasa sebagai contoh. Apakah Lisp ditafsirkan? Iya nih. Apakah sudah dikompilasi? Juga ya! Tapi itu di luar ruang lingkup. Jawabannya mungkin tidak akurat dengan kata-kata, tetapi tidak masalah untuk tujuannya; mendorong OP ke arah yang benar, dan itulah yang terpenting. Di sini, ambil +1 saya.Bahasa tertanam adalah istilah teknis yang tepat. Dalam praktiknya, bahasa yang digunakan di dalam aplikasi lain (seperti permainan) sering disebut sebagai bahasa scripting atau bahkan ditafsirkan , meskipun mereka tidak harus ditafsirkan atau digunakan untuk mengotomatisasi tugas-tugas rutin. Googling "bahasa scripting untuk game" mungkin akan menghasilkan hasil yang lebih bermanfaat daripada mencari "bahasa yang disematkan".
sumber
Anda mencari cara untuk mengubah kode menjadi beberapa tindakan. Inilah yang dilakukan penerjemah .
Lihatlah Python. Anda menjalankannya, dan bam! Anda mendarat di REPL ( R ead E val P rint L oop).
Anda mendefinisikan fungsi "halo" yang mencetak "Halo, dunia". Dan begitulah!
Perhatikan bahwa Anda tidak mengkompilasi apa pun; penerjemah melakukan beberapa sihir untuk membuat fungsi dengan cepat (selama runtime) dan sekarang Anda dapat menyebutnya.
Hal yang sama berlaku untuk game. Alih-alih memiliki REPL, Anda memiliki game dengan modul REPL. Gim ini mungkin memulai REPL dan menjalankan semua yang lain di REPL ini, sehingga Anda memiliki akses ke data dan dapat memodifikasinya secara aktif.
Jika Anda bekerja dengan bahasa besar seperti C ++, mereka cenderung kurang dinamis dan mungkin dikompilasi. Anda ingin lebih mudah. Anda bisa membuat bahasa Anda sendiri, atau menggunakan beberapa yang sudah ada (seperti CoffeScript, Squirrel, Lua, Scheme, ...)
Ini sering disebut bahasa scripting , karena Anda menggunakannya untuk menulis skrip yang dibangun di atas mesin game yang dikembangkan dalam beberapa bahasa lain (misalnya C ++).
sumber
Jika bahasa pemrograman dalam game hanya dirancang untuk tujuan permainan, maka itu adalah bahasa khusus domain .
Keuntungan (dan kerugian) dari bahasa-bahasa khusus domain adalah bahwa bahasa itu sendiri dapat membatasi apa yang dapat dilakukan oleh pengguna (yaitu Anda dapat melarang koneksi ke internet). Anda bisa mendesain bahasa yang membuat tugas gim yang umum lebih mudah daripada dalam bahasa tujuan umum. Kerugiannya adalah bahwa pengguna harus belajar bahasa baru.
Hanya menjalankan kode pengguna yang tidak bersih dalam bahasa tujuan umum (seperti python atau perl) dari dalam gim Anda, dapat memungkinkan pengguna untuk mengacaukan hal-hal yang tidak boleh ia mainkan. Tapi itu tergantung pada gim Anda. Jika Anda tidak keberatan pengguna melakukan hal-hal seperti membuka jendela baru dari dalam game Anda atau apa pun yang mereka suka, Anda dapat menggunakan bahasa tujuan umum dan mengekspos binding ke fitur-fitur tertentu dari dunia game Anda.
sumber
Ada dua contoh yang bisa saya pikirkan di atas kepala saya. Keduanya tampaknya melakukan persis apa yang Anda minta.
Yang pertama adalah screeps. https://screeps.com/ Anda dapat membaca banyak tentang bagaimana mencapai tujuan ini di http://support.screeps.com/hc/en-us/articles/205960931-Server-side-architecture-overview
Yang kedua adalah ComputerCraft http://www.computercraft.info/ Mereka tidak menjelaskan secara detail bagaimana cara kerjanya tetapi sedikit dapat dilihat di wiki mereka http://www.computercraft.info/wiki/Main_Page
Intinya, gim utama menjalankan juru bahasa di utas terpisah, lalu memungkinkan utas itu memanipulasi dunia gim melalui panggilan API.
Dalam kedua contoh, sementara bahasa hampir tidak terbatas (hanya beberapa panggilan diblokir karena alasan keamanan) manipulasi dibatasi oleh panggilan API yang dapat dibuat.
Biasanya sangat sedikit pekerjaan yang diperlukan untuk memulai sesuatu seperti ini. Kamu butuh
Tidak ada satu cabang pemrograman yang menangani semua masalah ini. Tetapi Anda akan membutuhkan dasar yang kuat dalam multi-threading, dan pengetahuan umum tentang cara kerja seorang juru bahasa.
sumber
Executable yang dikompilasi harus berisi parser yang dapat membaca kode program eksternal . Kode program tidak harus terlihat seperti C atau Python atau xyz - bisa berupa data deskriptif apa saja yang cocok untuk tujuan yang dimaksud. Misalnya swedia, atau morse.
Kode program eksternal perlu memiliki sintaks , sehingga parser memahaminya saat membacanya karakter demi karakter. Sintaks dapat menggambarkan (dan kode dapat berisi) pengidentifikasi, nilai numerik, operator, dll .
Parser sudah diperbaiki (dikompilasi) tetapi bekerja pada kode eksternal yang fleksibel.
Executable yang dikompilasi harus memiliki API internal untuk fungsionalitas yang relevan. sehingga parser dapat melakukan tindakan. Kemungkinan besar harus ada (dua arah) akses ke data internal yang dapat dieksekusi juga, atau parser harus menyediakan beberapa jenis penyimpanan data dan tata graha.
Parser dapat membaca kode program eksternal pada startup yang dapat dieksekusi , atau dapat membaca (bagian) ad hoc , atau dapat membaca ulang per setiap frame (tidak efisien), atau kode tersebut bahkan dapat diketik dengan tangan dan diposting ke parser saat bersiap-siap (seperti: "pindahkan unit X maju 5 langkah" [enter]).
Pada dasarnya, kode eksternal tidak diperbaiki - dapat berubah setiap tahun, hari atau menit, tetapi masih dapat dieksekusi tidak perlu dikompilasi ulang. Hanya perilaku yang dihasilkan, yang dihosting oleh yang dapat dieksekusi, yang berubah.
Teks yang sedang Anda baca saat ini adalah (agak, dan bahkan lebih jika itu diucapkan) ditafsirkan karena Anda "mengeksekusi" itu di otak Anda saat membacanya, tanpa mengetahui apa kalimat berikutnya mengatakan (atau bahkan jika mungkin, secara diam-diam berubah dengan benar sekarang). Berbeda dengan Stack Overflow (pre) yang mengkompilasi seluruh cerita menjadi bytecode di otak Anda, yang kemudian mengeksekusinya - dan ofc maka tidak bisa berubah lagi.
The Fenomena yang terus menerus adalah interpretion. Scripting hanyalah tindakan membuat deSCRIPTion, atau menulis . Semua pengkodean komputer adalah skrip imo - kami menjelaskan apa yang kami inginkan terjadi. Kata "scripting" memiliki arti yang agak miring, jadi baiklah. Kami tahu apa yang kami maksud.
Sama sekali tidak ada yang luar biasa dengan bahasa yang ditafsirkan, dan itu sama sekali bukan istilah yang bisa diperdebatkan . Banyak dari mereka ada, dan beberapa yang paling tua ditafsirkan sebagai lawan kompilasi. Dalam bahasa yang ditafsirkan, misalnya seseorang dapat mengetik dengan tangan:
sock = Socket.New (AddressFamily.InterNetwork, SocketType.Stream ProtocolType.Tcp) [ENTER]
... dan kemudian pergi untuk 30 ... tidak, istirahat kopi 45 menit :-). Ketika kembali, "kaus kaki" ada dan siap untuk digunakan lebih lanjut dengan mengetik lebih banyak dengan tangan, atau membiarkan otomatisasi penerjemah melanjutkannya.
sumber