1

我打算用 Java 创建一个简单的 Visual Novel 游戏引擎。我以前为 Java 开发过,但我有其他语言的经验。我想做的是创建我自己的脚本语言,人们可以使用它与引擎一起使用脚本制作完整的游戏,因为我认为视觉小说足够简单。

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

正如您可能会说的那样,我是一个新手。谢谢。

4

5 回答 5

2

听起来您需要一种特定于领域的语言 (DSL)。这是一篇关于Java 中 DSL的文章

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

还有一个关于 SO的相关问题。

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

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

于 2012-09-28T17:01:03.323 回答
1
  1. 不要这样做。编写一门新语言非常复杂。设计语法、解析、错误报告、性能。

  2. 它已经存在:用 Java 创建元语言

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

于 2012-09-28T17:02:25.043 回答
0

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

于 2012-09-28T17:01:58.070 回答
0

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

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

C、使用java提供的ScriptEngine,调用脚本。
请参阅此处的示例,了解如何从 java 中调用 JavaScript 脚本。

于 2012-09-28T17:10:29.657 回答
0

这个问题很老,我参加聚会有点晚了(虽然这个问题还没有回答),但这是可能的。据我了解,这听起来像是Just Another Framework的工作。完全披露:我是我所描述的框架的开发者。我有一个类似的问题,并编写了这个框架来重用这个系统,它适用于这类问题。

TL;博士

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

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

您几乎可以使用所有编程语言来做到这一点。您应该考虑使用 Javascript 或 Lua 或 [...] 并将它们放入文件中,而不是创建自定义脚本语言。Java 在这些语言中占有一席之地。您还应该考虑从文件夹中读取 .java 或 .class 文件并将它们放入您的“游戏引擎”。但是,如果您想提供自己的语言并且没有人可以改变您的想法(这是我的问题),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 慢。

于 2018-10-03T16:01:33.757 回答