Java游戏引擎,编写自己的脚本语言?

时间:2012-09-28 16:56:19

标签: java scripting

我打算用Java创建一个简单的Visual Novel游戏引擎。我以前开发过Java,但我有其他语言的经验。我想做的是创建我自己的脚本语言,人们可以使用引擎从剧本中制作出完整的游戏,因为我认为Visual Novels非常简单。

我不知道的是,Java是否适合制作这样的脚本语言?我想象的方式是,引擎读取游戏文件夹中的脚本文件,并接受输入并执行链接到某个功能或类似功能的每个命令。我不确定在理论上会有多么困难。

你可能会说我是新手。 感谢。

5 个答案:

答案 0 :(得分:2)

听起来您需要特定于域的语言(DSL)。这是关于DSLs within Java

的文章
  

DSL是为客户量身定制的小型,富有表现力的编程语言   具体任务。在这个由四部分组成的系列中,Venkat Subramaniam   介绍了DSL的概念,并最终向您展示如何构建   他们使用Java

并且SO上有一个related question

您可以使用Scala to write DSLs并在JVM上运行它们。但是我会警告你,如果没有Scala知识,这是一个(IMO)非平凡的任务。

或者,您可以将脚本语言的Java实现与Java Scripting API一起使用。这将允许您使用现有语言并将其编译为字节码。您正在使用现有语言的优势。缺点是它不是特定于您的特定需求。

答案 1 :(得分:1)

  1. 不要这样做。编写新语言非常复杂。设计语法,解析,错误报告,性能。

  2. 它已经存在:Creating meta language with Java

  3. 首先考虑。人们会喜欢你使用熟悉的语法。

答案 2 :(得分:0)

虽然技术上可能这样做,但我不知道Java是否是你最好的选择。虽然我不知道您项目的范围或目的,但我建议PyGame作为游戏/脚本语言。 (你说你有其他语言的经验,所以我认为切换到Python是好的)

答案 3 :(得分:0)

我认为以上答案给出了很好的指导。
我想提供更多的想法:
A.提供一个java“GAME API”,它可以通过REST / SOAP Web服务公开,并且可以生成客户端类(例如,获取WSDL,并从中生成客户端类)。

B.将API作为jar文件提供,让游戏实现一个将加载外部jar的File类加载器,并使用开发人员将使用API​​开发的类。
Here是如何实现这样的类加载器的示例。

C.使用java提供的ScriptEngine来调用脚本。
请参阅here一个如何从java中调用JavaScript脚本的示例。

答案 4 :(得分:0)

这个问题很老,我参加聚会有点晚了(尽管这个问题还没有得到回答),但是有可能。据我了解,这听起来像是Just Another Framework的工作。全面披露:我是我所描述的框架的开发人员。我遇到了类似的问题,并编写了此框架以重用此系统,从而解决了此类问题。

TL; DR

如果要使用自己的功能齐全的完美语言,请不要使用JAF。
如果您只想创建一个简单的脚本部分,将代码的各个部分解耦,或者要在运行时评估“用户输入”脚本,请使用JAF。(如本主题中的主题)。

  

我不知道的是,Java是否适合制作这种脚本语言?

几乎所有的编程语言都可以做到。您应该考虑使用Javascript或Lua或[...]并将它们放入文件中,而不是创建自定义脚本语言。 Java has a place for those languages。您还应该考虑从文件夹中读取.java或.class文件,并将其放入“游戏引擎”中。但是,如果您想提供自己的 语言,并且没有人可以改变主意(那是 my 问题), JAF 可以为您提供帮助。

JAF 是一个框架,允许您在Java中定义自定义脚本语言,可以在运行时对其进行评估和执行。您为解析器提供了一些功能,规则以及原始脚本,结果是一组固定的指令(以使用者的形式),可以随意执行多次。

这绝不是在Java之上构建的另一种语言!它旨在成为您语言的基础。不过,它仅用于创建小零件。一个例子就是某种逻辑,这些逻辑应该在不停止应用程序的情况下可以互换。此逻辑应通过小型脚本执行,并通过数据库或(如您的情况)通过文件夹中的文件提供。

您可以使用解析器来解析用户创建的“原始脚本”。该解析器采用“策略/命令模式”形式的“函数和规则”,基本上定义了您的语言。解析后,将返回一个“脚本”对象,该对象可以执行任意多次。您还可以设置脚本的值,并由此将该脚本连接到实际且正在运行的Java代码。

但是我真正喜欢的是,您可以通过“规则和功能”提供自定义脚本元素,这些规则和函数基本上直接连接到Java。只是一个示例就是printline函数。这将调用System.out.println();。如我所说,这只是一个示例,但您可以想象可以从函数和规则中调用任何现有代码。

一个(非常)简单的用法示例如下:

String rawScript = ... //your users script here

Parser parser = Parser.create(); // used to parse the script
parser.add(IOModule.getPackage()); // add packages of Functions and Rules

Script script;
try {
    script = parser.parse(rawScript); // Create the Script
}  catch (ParsingFailedException e) {
    // Handle an error while parsing the script
    // Do not continue, there is no script!
}

script.setValue("yourKey", /* Whatever should be available in your script */); // Inject outside variables for your Rules/Functions

try {
    script.run(); // Execute the script
} catch (ExecutionFailedException e) {
    // Handle an error at the scripts execution
}

我不想写一本有关如何使用此框架的书。看看wiki,在那里有更好的解释。

这样做的好处是,您可以通过提供简单的命令来解析原始脚本的特定部分,从而简单地定义自己的语言。它们只是“应用”;所有的魔力都隐藏在框架中。 frameworks-wiki中对此进行了一些解释,但是我很不擅长解释。因此,您可以通过提供语言的构建块来创建自己的小脚本语言,而无需对计算机理论的深入了解。

尽管有一些问题。当前与JSR 223不兼容。而且,(当然)它比playn java慢。