1

解释

我正在用 Java 开发一个游戏,我在地图上有可编写脚本的对象(按钮、开关等)。可编写脚本是指对象具有事件(onActivation、onPress 等),并且需要将脚本文件附加到对象以便在其激活或按下时执行某些操作。

所以事件处理是通过脚本完成的。我的想法是通过 GroovyScriptEngine.createScript 方法在 Java 中创建一个 Groovy Script 对象。然后我在 java 中调用 Script.invokeMethod("onActivation", null) 在 onActivation 发生时运行脚本。这似乎有效。

问题

但是我的 groovy 脚本文件有问题。这是文件:

test.groovy

def someVariable = 'test';

def onActivation() {
    println testMessage;   // comes from bindings
    println someVariable;
}

这是我创建 Script 对象的 java 代码:

GroovyScriptEngine engine = new GroovyScriptEngine("assets/Scripts/");
Binding bindings = new Binding();
bindings.setProperty("testMessage", "Hello Script World!");
Script script = engine.createScript("test.groovy", bindings);

稍后在 java 代码中,当处理 onActivation 事件时,我从脚本中调用 onActivation 函数:

public void onActivationHandler() {
    script.invokeMethod("onActivation", null);
}

但是我的 groovy 脚本失败并显示以下消息:

Uncaught exception thrown in Thread[LWJGL Renderer Thread,5,main]
groovy.lang.MissingPropertyException: No such property: someVariable for class: test

如果我删除 someVariable 声明和我打印它的行,我的脚本将工作并打印以下消息: Hello Script World!

TL;博士

为什么我的脚本失败?为什么我的函数看不到名为someVariable的变量?

编辑

当我尝试使用 GroovyShell 而不是 GroovyScriptEngine 时,也会发生同样的事情。

编辑2

如果我尝试通过调用script.getProperty("someVariable")来获取Java 代码中someVariable的值,它会抛出一个异常,告诉我该变量不存在。

org.codehaus.groovy.runtime.metaclass.MissingPropertyExceptionNoStack: No such property: someVariable for class: proof
4

1 回答 1

1

好吧,我在这里找到了答案。我的 test.script 应该是这样的:

import groovy.transform.Field

@Field String someVariable = 'test';

def onActivation() {
    println testMessage;   // comes from bindings
    println someVariable;
}

该脚本实际上变成了一个类(即使它不包含类声明)。我需要添加 @Field 注释以使其对声明的函数“全局”。

它还解决了EDIT2中提到的问题。该变量通过 Java 中的script.getProperty("someVariable")调用变得可用。

于 2014-08-12T19:37:44.663 回答