我想做一个可修改的游戏。这如何影响我的编程语言选择?[关闭]


26

我已经开始用Java制作一些小型游戏,并且我正在考虑为更大的项目学习C#。我非常想制作一款可修改的游戏,但有人告诉我,如果我希望该游戏可修改,我就必须坚持使用Java,尽管我不明白为什么。

那么,什么编程语言特性使该语言更适合可修改游戏?


3
如果你想使一个moddable游戏,PhysicsFS可能是了解一个非常有用的库。(它与物理学无关,不要让这个名字愚弄您。:))
Paul Manta'1

10
“但是有人告诉我,如果我想对游戏进行修改,就必须坚持使用Java。”顺便说一下,这是BS。
Ray Dey 2012年

Answers:


18

这取决于您要如何设计mod系统。我将探索其中的两个。

开发包

您很有可能会要求您的改装者使用与您使用的语言相同的语言,并通过反射(或类似,取决于您选择的语言)加载mod。显然,这将限制您使用可以进行后期绑定的语言-并且有很多语言可以做到这一点(即使C语言也可以通过一些巧妙的LoadLibrary技巧进行后期绑定)。您甚至可以进行一些元改装,其中一个mod可以托管其他mod(例如,脚本化的mod)。

这种方法的第一个问题是隐藏内部状态。以C#为例,modder可以简单地使用反射来访问私有成员,C也可以这样做(尽管需要更多的努力)。

第二个问题是托管。人们真的不喜欢在没有沙盒的情况下在其系统上运行的外来代码。在最坏的情况下,您可以编写一个设置种子箱的mod。如果将其安装在ISP上,可能会严重损害其声誉。

脚本编写

Modders将使用Lua之类的语言来创建mod。您要么需要一种可以调用本机代码(与Lua交互)的语言;否则您将不得不使用自己选择的语言来编写自己的脚本语言。

这里的第一个问题是大多数脚本语言都被解释了,这对于实时系统可能是不可接受的(尽管请参见LuaJIT)。例如游戏。

具有讽刺意味的是,这里仍然存在第二个问题。以Lua为例,令我非常失望的是,它在核心/默认库中包含“脱壳”功能-使其在沙盒环境中完全没有用(无需大量的工作,运气和维护),很难描绘出我对此感到多么生气,但是我真的希望他们在加入这些反特征的同时喝一些浓烈的鸡尾酒。如果您滚动自己的语言,显然可以轻松避免这种情况(请参阅:UnrealScript)。

最后,与脚本引擎进行交互的成本可能会高得惊人-再次以Lua为例,与C#结合:C#在调用本机函数(通过P / Invoke)时具有相当大的开销,而Lua则是一个“简陋”的API。如果您设计“脚本SDK”的方式需要在主要语言和脚本语言之间进行大量聊天(请注意C确实没有此问题),则可能会导致问题。同样,您可以通过编写自己的脚本语言(对于C#将其编译为MSIL)并在[虚拟]环境下以最快的方式执行它,来回避这个问题。

因为脚本实际上在与您的主代码完全不同的系统上运行,所以您可以完全控制对内部状态的访问(除非它们使用前面提到的shell函数做一些花哨的事情)。

结论

我确实有点偏离主题,但是,您基本上可以从那堵墙得到的是,您应该能够使用任何语言(我敢说您可以)制作可修改的游戏-但使用某些语言可能会导致更多工作。我是否对安全性有些怀疑?是的,关于用户代码,您也应该如此。


在您描述的第一种情况下,您是在谈论用户实际上是在编写自己的动态库并将其插入游戏吗?我以前曾在库中使用过此功能(例如,在音频库中添加新的编解码器等),但可能是因为我从没过多研究过改装,所以从未遇到过类似游戏的情况。我对此感到很好奇(因为用户似乎很难知道如何做到这一点,而且我通常认为mod是可访问的),所以您知道任何示例吗?大多数时候,我会看到一些专用工具,例如使用一些脚本的世界编辑器。
David Gouveia 2012年

1
@DavidGouveia我相信至少有一个版本的Paradox引擎用于Europa Universalis(以及不同时间段的同等游戏)支持某种形式的二进制修补程序(尽管可能是通过modder修补源代码并重新编译其中一个)。除了通过更改数据文件实现来更常用的mod之外,还包括游戏DLL(而不是适当的SDK支持)。
Dan Neely 2012年

2
@DavidGouveia参见:源引擎;甚至Winamp插件。我认为 Quake甚至可以这样工作。我已经知道您使用C#。因此,您可能想研究一下MEF(受控扩展框架):公开一个接口,通过反射将其加载,而bob是您的叔叔。
乔纳森·迪金森

@JonathanDickinson哦,我不知道Source引擎是在这种模式下运行的。一直想像一套工具,例如《上古卷轴建造》。感谢您提供的信息(我确实知道它是如何工作的,只是认为对于一般的modder来说可能太复杂了)。我真的很嘲笑“鲍勃是你叔叔的角色”。:-)
David Gouveia 2012年

1
Re Lua:这些人有一个沙盒Lua,适合在Wiki软件中使用(并且足够稳定,以至于英语Wikipedia都可以使用它)。我确定您可以根据需要对其进行调整,但是扩展名的某些部分已通过GPL认证,因此请咨询您的律师。
凯文

16

我想说的是,语言在这里并不是决定性因素,实际上,这取决于您制作定义它的游戏的灵活性和数据驱动性。

每个游戏都基于一组数据(例如,关卡,网格物体,配置,物品等所有数据)运行。普通游戏和可修改游戏之间的区别在于,后者提供了允许用户修改现有数据(或添加自己的数据)的工具。无论选择哪种语言,都应尝试使游戏尽可能以数据驱动,并避免对任何游戏内容进行硬编码。实际上,您可能会选择的任何语言都可以从磁盘读取数据,这是您所需要的大部分。

如果您只是创建供个人使用的工具(例如,您自己的关卡编辑器),然后对其进行完善并与用户共享,则也只有一半。该超级肉食男孩的关卡编辑器是相当多的是,该工具的改进verision游戏的开发过程中使用。

并且,根据游戏的类型,您可能希望允许用户编写一些游戏行为的脚本。在这种情况下,您应该早早就考虑将脚本语言纳入您的游戏中(或者是您自己的脚本语言,或者是像Lua或Python这样的流行语言)。这也属于数据驱动设计的范畴。如果您决定使用现有的脚本语言,则可能需要检查您选择的编程语言是否具有该脚本语言的绑定(通常以第三方库的形式)。


5

您选择的语言并不能真正决定游戏的可修改性,使用语言的方式更为重要。

如果您的大多数游戏都是数据驱动的(也就是说,游戏数据是在从您的代码读取的文件中定义的),则该游戏可以很容易地修改。这几乎可以用任何一种语言来完成。使用脚本语言还可以更轻松地修改游戏。

但是,这并不意味着不使用这些东西就不可能修改游戏。例如,《我的世界》根本不是一款非常可修改的游戏,但是对于Java和Minecraft来说,都有相当不错的反编译器,因此有很多工具可以使Minecraft成为可修改的(各种modloader,Bukkit)。有了这些工具,就有可能对Minecraft进行修改(但在某些国家/地区,从技术上讲,它们可能是非法的)。

我可以给您的最佳建议是使用您希望改装者使用的工具;如果从文件定义NPC,则可以对其进行修改;如果在代码中对其进行特殊处理,则可能无法修改。


1

Java非常适合编写可修改的游戏。

话虽如此,使游戏成为可修改游戏的最佳方法通常是采用一种动态语言,该语言可以嵌入更广泛的应用程序中并用于编写脚本。您通常需要一种动态语言,因为重点是能够在运行时与代码进行交互,而无需经历整个编译/构建/测试周期。

需要考虑的一些动态语言选择:

  • Groovy-一种极好的动态Java类语言,可以嵌入到较大的Java程序中。
  • Clojure -JVM的强大动态Lisp。对于某些修改者来说,可能很难理解,但它是一种功能非常强大的语言,可以很容易地嵌入。尚未看到它已用于游戏改装,但没有理由不这样做。
  • Lua-一种非常流行的游戏脚本语言。我相信可以在Java中使用JVM的版本(尽管我自己还没有尝试过这些版本)
  • JavaScript-通过Rhino在JVM上可用。游戏脚本是一个非常可靠的选择,因为很多人都知道一些JavaScript,而且原型对象模型非常适合游戏mod。

-2

尽管有点草率,但在Java中有一种更简单的方法可以做到这一点。您要做的就是将点Java文件放在一个文件夹中,然后将此批处理文件放入该文件夹,并将其命名为Run:

javac /src/.java Java / src /

注意:您可以添加所需的多个类。注意:在最后一行中,请确保不要将任何扩展名也称为.java,.exe,.bat,ect。

基本上,每次运行游戏时,这只会重新编译代码,因此,如果更改了游戏源,它将对其进行编译,然后运行新编译的游戏...遗憾的是,您无法将其他人的mod添加到游戏中。


雅各布我认为您不明白这个问题,请仔细阅读答案,看看是否可以帮助您了解此处所讨论的内容。
vikki 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.