Düzenlenebilir bir oyun yapmak istiyorum. Bu benim programlama dili seçimimi nasıl etkiler? [kapalı]


26

Java'da küçük oyunlar oynamaya başladım ve daha büyük bir proje için C # öğrenmeyi düşünüyorum. Düzenlenebilir bir oyun yapmak isterdim, ama birisi nedenini anlamıyor olmama rağmen oyunun denetlenebilmesini istiyorsam Java'ya bağlı kalmam gerektiğini söyledi.

Öyleyse, hangi programlama dili özellikleri bir dili mütevazı oyunlara daha uygun hale getirir?


3
Düzenlenebilir bir oyun yapmak istiyorsanız, PhysicsFS hakkında bilmek çok yararlı bir kütüphane olabilir. (Fizik ile ilgisi yok, adın sizi aldatmasına izin vermeyin. :))
Paul Manta

10
“Fakat birisi oyunun modunu değiştirmesini istersem Java'ya bağlı kalmam gerektiğini söyledi” Bu arada, BS.
Ray Dey,

Yanıtlar:


18

Mod sisteminizi nasıl tasarlamak istediğinize bağlı. İkisini keşfedeceğim.

SDK

Büyük olasılıkla, modderlerinizin sizinle aynı dili kullanmasını ve yansıtma yoluyla modları yüklemesini (veya tercih ettiğiniz dile bağlı olarak benzer şekilde) gereksinim duyarsınız. Bu, açık bir şekilde geç bağlanma yapabilen dilleri sınırlayacağınız anlamına gelir - ve bunu yapabilen iyi bir çok insan vardır (C bile akıllıca bir LoadLibraryhile ile geç bağlanma yapabilir ). Bir modun diğer modları barındırabildiği bazı meta-modding bile yapabilirsiniz (örn. Komut dosyası modları).

Bu yaklaşımla ilgili ilk sorun içsel durumu gizlemektir. Örneğin, C # alarak bir modder özel üyelere erişmek için basitçe yansıma kullanabilir, C de bunu yapabilir (daha fazla çaba gerekli olmasına rağmen).

İkinci sorun ise barındırıyor. İnsanlar, sistemlerinde çalışan sanal alan bulunmayan yabancı kodları gerçekten sevmiyorlar. En kötü senaryo olarak, bir tohum kutusu ayarlayan bir mod yazabilirsiniz; eğer bu bir ISS'ye kurulursa, itibarlarına ciddi zarar verebilir.

Komut

Modderler mod oluşturmak için Lua gibi bir dil kullanırlar. Yerel kodu çağırabilecek bir dil isteyebilirsiniz (Lua ile arabirim kurmak için); ya da kendi seçim dilinizi kendi dilinizde yazmak zorunda kalacaksınız.

Buradaki ilk sorun, çoğu betik dilinin yorumlanmasıdır; bu, gerçek zamanlı sistemler için kabul edilemeyebilir (ancak LuaJIT'e bakınız); oyunlar gibi.

İronik olarak ikinci sorun hala burada var; (çaba büyük miktarda, şans ve bakım olmadan) bir korumalı alan ortamı olarak tamamen yararsız hale - Ben çok olduğunu hayal kırıklığına uğradım bir örnek olarak Lua alarak 'bombardımanı aşımı' çekirdek / default kütüphanesinde bulunan işlevlere sahiptir bunun zor bu konuda ne kadar sinirlendiğimi canlandırıyor, ancak umarım bu anti-özellikleri eklerken güçlü kokteyller içiyorlar . Kendi dilinizi yuvarladıysanız bunu kolayca önleyebilirsiniz (bakınız: UnrealScript).

Son olarak, bir komut dosyası altyapısı ile etkileşime girme maliyeti engelleyici olabilir - yine bir örnek olarak Lua'yı C #: C # ile birlikte almak, yerel işlevler (P / Invoke aracılığıyla) çağrılırken önemli bir ek yüke sahiptir ve Lua oldukça 'konuşkan' bir API'dir. Eğer 'SDK betiğini tasarlama' yönteminiz ana dilinizle ve betik dili arasında çok fazla sohbet gerektiriyorsa bu sorunlara yol açabilir (C'nin gerçekten bu sorunu yaşamadığını unutmayın). Yine, kendi betik dilinizi yazıp (ve # # MSIL'e derleme durumunda) ve [sanal] ortamınızdaki en hızlı şekilde çalıştırarak bunu atlatabilirsiniz.

Betik esasen birincil kodunuzdan tamamen farklı bir sistemde çalıştığından, dahili duruma erişimi tamamen kontrol edebilirsiniz (daha önce bahsedilen kabuk işlevleriyle bazı süslü şeyler yapmazlarsa).

Sonuç

Biraz kapalı başlıkları saptırmak yaptım, ancak, ne temelde Garner metnin o duvardan can Bunun ne olmalıdır herhangi bir dilde bir moddable oyun yapabilmek (Bunu söylemek girişim olacaktır can ) - ancak bazı dillerde daha fazla çalışmaya yol açabilir. Güvenlik konusunda biraz anal mıyım? Evet, kullanıcı kodu söz konusu olduğunda siz de olmalısınız.


Tanımladığınız ilk senaryoda, kullanıcının kendi dinamik kütüphanesini programlayıp oyuna bağlamasından mı bahsediyorsunuz? Bunu daha önce kütüphanelerde (örneğin, yeni kodlayıcı eklemek için ses kütüphanesi, vb.) Kullanılmış olduğunu gördüm, ancak muhtemelen modlama için hiç bir zaman çok fazla incelemediğim için, bir oyun için asla böyle bir durumla karşılaşmadım. Bunu merak ediyorum (kullanıcının bunu nasıl yaptığını bilmesi gerçekten zor göründüğü için ve genellikle modları erişilebilir olarak görüyorum) bu yüzden herhangi bir örnek biliyor musunuz? Çoğu zaman, dünyadaki editörler gibi özel bir takım araçlar kullanıyorum.
David Gouveia

1
@DavidGouveia Ben Europa Universalis (ve farklı zaman dilimleri için eşdeğer oyunlar) için kullanılan Paradox motorunun en az bir versiyonunun (modder yamanın kaynağını alıp yeniden derlemiş olmasına rağmen) bir ikilik yama biçimini desteklediğine inanıyorum. bir veri dosyası uygulamasını değiştirerek daha sık kullanılan mod ek olarak) uygun SDK desteği olan oyun DLL'leri.
Dan Neely,

2
@DavidGouveia bkz: Kaynak motoru; hatta Winamp eklentileri bile. Ben düşünüyorum Quake bile böyle çalışır. C # kullandığını öğrendim; bu yüzden MEF'e (Yönetilebilir Genişletilebilirlik Çerçevesi) bakmak isteyebilirsiniz: bir arayüz açın, yansıma yoluyla yükleyin ve Bob sizin amcanız olsun.
Jonathan Dickinson

@JonathanDickinson Oh, Source motorunun bu modelde çalıştığını bilmiyordum. Her zaman Elder's Scrolls Construction set gibi bir araç seti hayal edin. Bilgi için teşekkürler ( Nasıl çalıştığı hakkında bir fikrim var , genel modder'ın kullanması için fazla karmaşık olabileceğini düşündüm). Ve gerçekten de "bob senin amcanın parçası" na güldüm . :-)
David Gouveia

1
Re Lua: Bu adamlar wiki yazılımında kullanıma uygun (ve Wikipedia'nın kullandığı kadar kararlı) kum havuzlu Lua'ya sahipler. Gereksinimlerinize uyarlayabileceğinizden eminim, ancak uzantının bazı bölümleri GPL’dir, bu nedenle avukatınıza danışın.
Kevin,

16

Dilin burada karar verici bir faktör olmadığını söyleyebilirim, oyununuzu tanımlayan oyuna ne kadar esnek ve veri odaklı davranıyorsunuz.

Her oyun bir veri kümesi üzerinde çalışır (örneğin, seviyelerden, kafeslerden, yapılandırmalardan, öğelerden her şey). Normal bir oyun ile değişken bir oyun arasındaki fark, daha sonra kullanıcının mevcut verileri değiştirmesine (veya kendi verilerini eklemesine izin veren) olanak sağlayan araçlar sağlamasıdır. Hangi dili seçerseniz seçin, sadece oyununuzu olabildiğince veri odaklı hale getirmeye çalışın ve herhangi bir oyun içeriğini kodlamaktan kaçının. Neredeyse, muhtemelen seçtiğiniz herhangi bir dil, ihtiyaç duyduğunuz şeylerin çoğunu diskten okuyabilir.

Ayrıca, kendi kişisel kullanımınız için (örneğin, kendi seviye editörünüz) araçlar oluşturup daha sonra bunları mükemmelleştirip kullanıcılarınızla paylaşıyorsanız, bu yol yarı yarıya. Super Meat Boy seviye editörü hemen hemen aracının geliştirilmiş Verision oyunun gelişimi sırasında kullanılan olmasıydı.

Oyunun türüne bağlı olarak, kullanıcıların oyun davranışlarından bazılarını kodlamasına izin vermek isteyebilirsiniz. Bu durumda , oyununuza bir scripting dili eklemeyi düşünmelisiniz (kendi seçiminiz ya da Lua veya Python gibi popüler bir seçenek olan varolan bir dil ). Bu aynı zamanda veri odaklı tasarım kategorisine girer. Mevcut bir betik dilini kullanmaya karar verirseniz, seçtiğiniz programlama dilinin bu betik dili için bağlayıcı olup olmadığını kontrol etmeye değer olabilir (genellikle 3. taraf kütüphaneleri biçiminde).


5

Seçtiğiniz dil, bir oyunun ne kadar ılımlı olduğunu, dili kullanma şeklinizi daha fazla belirleyemiyor.

Oyununuzun çoğu verilere dayanıyorsa (bu, oyun verileri kodunuzdan okunan bir dosyada tanımlanmışsa) oyun değiştirilebilir. Bu hemen hemen her dilde yapılabilir. Bir komut dosyası dili kullanmak da bir oyunu değiştirmeyi kolaylaştırır.

Ancak bu otomatik olarak bu şeyleri kullanmamak anlamına gelmez bir oyun mod imkansız yapar. Mesela Minecraft, hiç de modüler bir oyun değil, fakat Java için oldukça iyi bir kod çözücüler ve Minecraft için çok geniş bir topluluk var, bu yüzden Minecraft'ı modüle etmek için birçok araç yapıldı (çeşitli modloaders, Bukkit). Bu araçlarla Minecraft'ı değiştirmek mümkündür (ancak bazı ülkelerde teknik olarak yasa dışıdırlar).

Size verebileceğim en iyi tavsiye, modderlerin kullanmasını istediğiniz araçları kullanmak; Bir NPC'yi bir dosyadan tanımlarsanız, kodlanıp kodlanabilir, eğer özel durum için kodda büyük olasılıkla olamaz.


1

Java, düzenlenebilir bir oyun yazmak için mükemmeldir.

Bunu söylemek gerekirse, bir oyunu modüle etmenin en iyi yolu, genellikle daha geniş bir uygulamaya yerleştirilebilecek ve komut dosyası için kullanılabilecek dinamik bir dili benimsemektir . Genelde dinamik bir dil istersiniz çünkü nokta çalışma zamanında kodla tam bir derleme / derleme / test döngüsü geçirmeden etkileşimde bulunabilmektir.

Dikkate alınacak bazı dinamik dil seçenekleri:

  • Groovy - daha büyük Java programlarına yerleştirilebilen mükemmel bir dinamik Java benzeri dil.
  • Clojure - JVM için güçlü, dinamik bir Lisp. Bazı modderlerin kafasını karıştırması zor olabilir, ancak son derece güçlü bir dildir ve çok kolay bir şekilde gömülebilir. Henüz oyun modları için kullanıldığını görmedim fakat neden olmasın.
  • Lua - çok popüler bir oyun betik dili. JVM'nin Java içinden kullanabileceğiniz sürümleri olduğuna inanıyorum (bunları kendim denemediğim halde)
  • JavaScript - JVM'de Rhino aracılığıyla kullanılabilir . Pek çok insan bazı JavaScript'leri bildiği için oyun komut dosyası için oldukça sağlam bir seçim, ayrıca prototip nesne modeli oyun modlarına çok iyi uyar.

-2

Java ile bunu yapmanın daha kolay bir yolu var, ama biraz özensiz. Tek yapmanız gereken nokta java dosyalarını bir klasöre almak ve sonra bu toplu iş dosyasını klasöre koymak, Çalıştır olarak adlandırmak:

javac /src/.java Java / src /

Not: İstediğiniz kadar sınıf ekleyebilirsiniz. Not: Son satırda, .java, .exe, .bat, vb.

Bu temelde oyun her çalıştırıldığında kodu tekrar derleyecektir, bu yüzden oyun kaynağı değişirse derleyecektir ve sonra yeni derlenmiş oyunu çalıştıracaktır ... Ne yazık ki oyuna diğer insanların modlarını ekleyemezsiniz.


Jacob, soruyu anladığını sanmıyorum, lütfen cevapları okuyup, burada neyin tartışıldığını anlamana yardım edip etmediğini gör.
vikki
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.