Bir oyun içinde programlamaya izin veren teknoloji nedir?


27

Oyuncunun oyun içinde senaryo yazmasına / oluşturmasına izin veren bazı oyunlar vardır, örneğin: Uzay mühendisleri veya Psi .

Her ikisine de benzer bir şey kullanmak istiyorum, ancak bilgi bulmakta zorlandım, bu yüzden sorum şu:

Bir kullanıcı tarafından oluşturulan yeni kodu çalıştırmak için derlenen bir yazılımın yeteneğini kapsayan bir programlama dalı var mı?

Programlama dalıyla, PTG (Prosedürel Arazi Üretimi) gibi bir şey kastediyorum.

Bir soru ya da görüşe dayanarak fazla genişlemekten kaçınmak için , öğrenecek rehber ya da yer aramayacağımı açıkça belirtmeme izin verin, varsa teknolojinin adını veya tanımını (varsa) istiyorum.


22
Muhtemelen "Tercüman yazmak"?
MatthewRock

2
Son zamanlarda benzer bir soruyu yanıtladım , " Sanal Makine " yi kullanıcı kodunu çalıştıran sistem için bir terim olarak tartıştım ve ayrıca bu kodu geleneksel bir tercümandan daha hızlı uygulamak için Bytecode Paterni üzerindeki Oyun Programlama Paternleri makalesine atıfta bulundum .
DMGregory

3
Genellikle "komut dosyası" denir. Bir oyunda kodlamanın nasıl uygulanacağı ile ilgili bol miktarda (çeşitli) açık kaynaklı örnek ve gerçek kod bulacaksınız. Daha geniş kapsamda, derleyici programlamanın tüm alanı vardır (lexing, ayrıştırma, derleme, bağlama, yorumlama ... dahil) En geniş kapsamda (mutlaka faydalı olmak zorunda değildir), bu uygulamanızın sahip olduğu hemen hemen tüm kullanıcı etkileşimlerini gerektirir - bir komut dosyası altyapısı bir menüden seçim yapmak için gerçekten çok daha karmaşık bir yöntemdir.
Luaan

2
Bir Python programı Python scriptlerini barındırabilir. Buna metaprogramlama denir. Yorumlanan dillerin çoğu buna sahiptir.
user6245072 26:16

1
Space Engineers'daki AFAIK, kod, sanal alan ortamında C # kodunu derledi (oyun açık kaynak kodluydu , böylece çevrimiçi ortamda nasıl çalıştığını kontrol edebilirsiniz: github.com/KeenSoftwareHouse/SpaceEngineers ). Temel olarak oyun bir C # derleyicisiyle gelir ve kod yalnızca oyunun API işlevlerine erişime izin verir, böylece programın kapsamı yalnızca sizinle sınırlıdır. Eğer çok oyunculu oynuyorsanız, o zaman kod yalnızca makinenizde çalışır (diğer oyuncular / sunucu sadece oyun içi sonuçları görür)
Florian Castellane

Yanıtlar:


42

"Lua", "Lisp" veya "AngelScript" ( burada daha fazla ) gibi komut dosyası / gömülü / yorumlanmış dillerde yazılmış komut dosyaları , oyun sırasında [*] güncellenebilir ve daha sonra anında yorumlanır (= çalıştırılır).

Bu komut dosyalarındaki öğeleri yerel derlenmiş kodlamaya (C ++ vb.) Bağlayabilirsiniz, böylece komut dosyaları uygulamanızdan mantık yürütebilir. Örneğin. kullanıcının betiğe koyabileceği belirli bir komut, bunun sonucunda oyun içi karakterini oyun dünyasında belirli bir mesafeye hareket ettirir.

Bazı ilgili bağlantılı sorular:


[*] kullanıcı tarafından oyunun bir parçası olarak veya uygulamayı yeniden başlatmadan hızlı yineleme / test için devs


14
Bir şeyi "tercüme dil" olarak adlandırırken dikkatli olurdum. En iyi ihtimalle çok tartışmalı bir terimdir.
wondra

1
Computercraft (minecraft mod), LUA'yı oyun içindeki görevleri programlamak için bir betik dili olarak kullanır.
Tikeb

20
Yaygarayı gerçekten anlamıyorum. Lisp hem yorumlanabilir hem de derlenebilir. Dilleri nasıl sınıflandıracağımızı ve interpretediyi bir sınıflandırma olup olmadığını anlamak için burada değiliz; OP’nin bu dilden haberi olmayan, dilin derlenmesi gerekmediğini ancak yorumlanabileceğini söylüyoruz - ve örnek olarak bazı dilleri veriyoruz. Lisp yorumlanır mı? Evet. Derlendi mi? Ayrıca evet! Ama bu kapsam dışında. Cevap, ifadeler ile yanlış olabilir, ancak amaç için uygun değildir; OP'yi doğru yöne iter ve önemli olan da budur. İşte, + 1'imi al.
MatthewRock

1
Bir dil sadece derleme olsa bile, bir IDE, derleyici ve çalışma zamanını oyununuza yerleştirmekten ne alıkoyuyor? Bütçe hariç.
Ordous

3
@DanielJour Teorik olarak bir dilin uygulanmasından farklı olabileceğini kabul edersem (makine koduna göre veya bir vm için bytecode'a derlenir), yine de, aksi belirtilmediği sürece C'nin derlendiği zamandan tasarruf sağlayan bir varsayımdır (ve hayal edebiliyor musunuz?) her seferinde "bekle, derlenip C mi, yorumlandığında C" diye sorarsan elde edebileceğin bakışlar). OP'nin amacı için, yorumu destekleyen dillere bakması gerekir; Derlenip derlenemeyecekleri de bir mesele değil çünkü onu nasıl kullanacağını bilmiyor.
Blackhawk

12

Gömülü dil uygun teknik terimdir. Uygulamada, diğer uygulamalarda (oyunlar gibi) kullanılan dillere, genellikle rutin görevlerin otomatikleştirilmesi için yorumlanmaması veya kullanılmaması gerekmekle birlikte , genellikle betik veya yorumlanmış diller denir . Googling "oyunlar için komut dosyası dilleri" muhtemelen "gömülü diller" için arama yapmaktan daha faydalı sonuçlar verir.


11

Kodu bazı işlemlere dönüştürmenin bir yolunu arıyorsunuz. Bu tam olarak ne tercümanların yaptığı budur.

Python'a bir göz atın. Sen koş ve bam! Sen iniş REPL ( R ead E val P rint L OOP).

"Merhaba dünya" yazdıran bir "merhaba" fonksiyonunu tanımlarsınız. İşte buyur!

Hiçbir şey derlemediğine dikkat et; tercüman anında çalışma fonksiyonu oluşturmak için biraz sihir yaptı (çalışma zamanı sırasında) ve şimdi onu arayabiliyorsunuz.

Aynısı oyunlar için de geçerlidir. REPL'e sahip olmak yerine, REPL modülüyle bir oyuna sahipsiniz. Oyun muhtemelen REPL'i başlatır ve sonra bu REPL'deki diğer her şeyi çalıştırır, böylece verilere erişebilirsiniz ve aktif olarak değiştirebilirsiniz.

C ++ gibi büyük dillerle çalışıyorsanız, daha az dinamik olmaları ve muhtemelen derlenmiş olmaları. Biraz daha kolay istiyorsun. Ya kendi dilinizi yaratın ya da bazılarını kullanın (CoffeScript, Squirrel, Lua, Scheme, ... gibi).

Bunlara genellikle betik dilleri denir , çünkü onları başka bir dilde geliştirilen oyun motoru üzerine kurulu betikleri yazmak için kullanırsınız (örneğin C ++).


2

Oyun içi programlama dili sadece oyunun amacı için tasarlandıysa, o zaman alana özel bir dildir .

Etki alanına özgü dillerin avantajı (ve dezavantajı), dilin kendisinin kullanıcının yapabileceklerini sınırlayabilmesidir (yani internete bağlanmaya izin vermeyebilirsiniz). Tipik oyun görevlerini genel amaçlı bir dilden daha kolay hale getiren bir dil tasarlayabilirsiniz. Dezavantajı, kullanıcının yeni bir dil öğrenmesidir.

Sadece kimlik doğrulaması yapılmamış kullanıcı kodunu genel bir dilde (python veya perl gibi) izin verebilir. Ama bu senin oyununa bağlı. Kullanıcıların oyununuzdan yeni pencereler açmak ya da istedikleri şeyleri yapmalarına aldırış etmiyorsanız, genel amaçlı bir dil kullanabilir ve oyun dünyanızın belirli özelliklerine bağlar bırakabilirsiniz.


1

Kafamın üstünden düşünebileceğim iki örnek var. Her ikisi de tam olarak istediğini yapıyor gibi görünüyor.

Birincisi screeps. https://screeps.com/ Bu hedefi nasıl gerçekleştirdiğini http://support.screeps.com/hc/en-us/articles/205960931-Server-side-architecture-overview adresinde bulabilirsiniz.

İkincisi, ComputerCraft http://www.computercraft.info/ Nasıl çalıştıkları kadar ayrıntıya girmiyorlar, ancak wikilerinde biraz görülebiliyor http://www.computercraft.info/wiki/Main_Page

Temelde, ana oyun ayrı bir konuya göre bir tercüman çalıştırır, daha sonra bu iş parçacığının oyun dünyasını API çağrıları yoluyla manipüle etmesine izin verir.

Her iki örnekte de dil neredeyse sınırsızken (yalnızca güvenlik nedeniyle engellenen bazı aramalar) manipülasyonlar, yapılabilecek API çağrılarıyla sınırlıdır.

Genellikle böyle bir şeyin başlaması için çok az çalışma gerekir. İhtiyacın var

  • oyununuzun döngüsünü koruyan bir iş parçacığı yöneticisi (bir iş parçacığı döngüyü kilitlemesine veya bir çok kaynağa sarılmasına izin vermez). Her iki örnek de zamana dayalı bir sınırlayıcı kullanır.
  • bir dili çalıştırmak için tercüman LUA bugünlerde oldukça yaygındır.
  • oyun dünyasını değiştiren bir dizi API çağrısı. Eğlenceli olan bir programlama dili, onunla hiçbir şey yapamıyorsanız.
  • bir kaynak yönetimi uygulaması. Başka bir deyişle, kod dosyalarını saklamanın ve oyunda bunlara başvuru yapmanın bir yolu.

Tüm bu kaygıları ele alan tek bir programlama dalı yoktur. Ancak çoklu iş parçacığında güçlü bir temele ve bir tercümanın nasıl çalıştığı hakkında genel bir bilgiye ihtiyacınız olacak.


0

Derlenmiş çalıştırılabilir dosya harici program kodunu okuyabilen bir ayrıştırıcı içermelidir . Program kodunun C veya Python veya xyz gibi görünmesi gerekmez - söz konusu amaca uygun olan her türlü açıklayıcı veri olabilir. Örneğin İsveççe veya mors.

Dış program kodunun bir sözdizimine sahip olması gerekir , böylece ayrıştırıcı onu karakter karakter okuduğunda anlar. Sözdizimi tanımlayıcıları ( sayısal değerleri, operatörleri vb. ) Tanımlayabilir (ve kod içerebilir). . .

Ayrıştırıcı sabittir (derlenir) fakat esnek dış kod üzerinde çalışır.

Derlenmiş yürütülebilir dosyanın dahili bir API'si olması gerekir ilgili işlevselliği . böylece ayrıştırıcı işlem yapabilir. Büyük olasılıkla, yürütülebilir dosyanın dahili verilerine de (çift yönlü) erişim olmalı veya ayrıştırıcı bir tür veri depolama ve temizlik sağlamalıdır.

Ayrıştırıcı, çalıştırılabilir başlangıçta harici program kodunu okuyabilir veya geçici olarak okuyabilir (bölümlerini okuyabilir) veya her karede yeniden okuyabilir (verimsiz olabilir) veya kod elle bile yazılabilir ve hazırladığında ayrıştırıcıya gönderildi (": ünite X'i 5 adım ileri götür" [gir]).

Temel olarak, harici kod sabit değil - herhangi bir yıl, gün veya dakika içerisinde değişebilir, ancak yine de yürütülebilir dosyanın yeniden derlenmesi gerekmez. Yalnızca yürütülebilir dosya tarafından barındırılan davranış, değişir.

Şu an okuduğunuz metin (eğer konuşulursa ve hatta daha fazlası) yorumlanır çünkü yorumlanırken bir sonraki cümlenin ne söylediğini bilmeden (ya da muhtemelen sinsice doğru şekilde değiştiyse bile) onu beyninize "uygularsınız" şimdi). Stack Overflow'un (pre) bütün hikayesini beyninizdeki bytecode ile derlemesinin aksine, o zaman bunu uygular - ve daha sonra değiştiremezdi.

, Devam eden fenomen yorum yapma olduğunu. Komut dosyası yalnızca bir deSCRIPTion oluşturma veya yazma eylemidir . Tüm bilgisayar kodlamaları imo komut dosyasıdır - ne olmak istediğimizi açıklarız. "Scripting" kelimesinin biraz eğik bir anlamı vardır, ama bu yüzden iyi olun. Ne demek istediğimizi biliyoruz.

Yorumlanan dillerle kesinlikle olağanüstü bir şey yoktur ve hiçbir şekilde tartışmalı bir terim değildir . Bunların birçoğu var ve en eski olanlardan bazıları derlenmiş olarak yorumlanıyor. Tercüme edilmiş bir dilde, örneğin elle yazılabilir:

sock = Socket.New (AddressFamily.InterNetwork, SocketType.Stream ProtocolType.Tcp) [ENTER]

... ve sonra 30 ... hayır, 45 dakikalık bir kahve molası için gidin :-). Dönerken, "çorap" var ve elle daha fazla yazarak veya tercüman otomasyonunun onunla devam etmesine izin vererek daha fazla kullanıma hazırdır.


Yorumlanan bir dilin yavaş olması gerektiği konusunda yaygın bir yanılgı vardır. Bu doğru değil. Bu tartışmayı yorumlar için çok geniş kılan çeşitli faktörlere bağlı olarak, yorumlanmış dil, hızlı olarak kabul edilen (genellikle C) kontrol diline göre daha hızlı, hatta daha hızlı, hatta bazı işlemler için daha büyük veya daha yavaş olabilir. Soketli örnek muhtemelen C'deki gibi aşağı yukarı çalışır, bu nedenle örnek yanıltıcıdır. Ayrıca, derlenmiş işlevleri bir çalışma zamanında bazı dillerde yeniden tanımlayabilirsiniz ve yorumlama sadece "bir seferde bir talimat alma" anlamına gelmez.
MatthewRock 27:16

Elbette, çevrilen bir dil de daha hızlı performans gösterebilir - sonuçta yürüten bayt kodundan sonra ve yorumlayıcı otomasyonuna bağlı olarak yürütme çok daha iyi hale getirilebilir. Ek olarak, bazı tercümanlar koddan kodun bölümlerini bytecode (ve yürütme) olarak derleyebilirler, ad hoc Örnek, "O zaman bir talimatı gidiyor" özgürlüğünün bir örneğidir? Bu bir aşırı basitleştirme olabilir, belki de "gelecek kod esnekken" ekleyiniz.
Stormwind

Bir senaryo gibi daha çok "senaryo" düşünün - hala aktörlere ihtiyacınız var ve bunlar tiyatro bilimleri yerine (sonunda bunlar biyoloji ve sosyolojiye dayanıyor olsalar da) doğrudan biyoloji ve sosyoloji açısından tanımlanıyor. bu amaç için uygun fakat diğer değil :)
rackandboneman 28:16
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.