我正在使用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!
为什么我的脚本会失败?为什么我的函数没有看到名为 someVariable 的变量?
当我尝试使用GroovyShell而不是GroovyScriptEngine时,会发生同样的事情。
如果我通过调用 script.getProperty(" someVariable")尝试在Java代码中获取 someVariable 的值,则会抛出异常我认为变量不存在。
org.codehaus.groovy.runtime.metaclass.MissingPropertyExceptionNoStack: No such property: someVariable for class: proof
答案 0 :(得分:1)
好的,我找到了答案here。我的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”)调用可用。