使用多个 ScriptEngine
Using multiple ScriptEngines
我有一个文件夹,可以包含任意数量的脚本,这些脚本可以作为咒语使用。这些脚本文件中的代码对于其中的大多数来说都非常少。
一个简单的咒语可能包含:
- Return 姓名
- Return 伤害
- 显示效果
- Launch/control弹丸
更高级的可能会改变地形或类似的东西。
Spell
classJava
端调用脚本中的cast函数
我想知道的是执行此操作的不同方法及其优缺点。我现在看到的方式是:施放咒语时创建一个新的 ScriptEngine
对象,完成后销毁它。
我认为不可能在现有的 ScriptEngine
上设置新的 ScriptContext
,因为该咒语可能还没有完成施法,在施放下一个咒语之前,除非我实施某种排队系统。
与其每次都创建一个新的脚本引擎,不如维护一个 ScriptEngine
实例并且每次只创建一个新的上下文(使用新的全局变量)。然后在该上下文中评估您的脚本:
ScriptContext context = new SimpleScriptContext();
context.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE);
engine.eval(script, context);
如果您的脚本不在全局范围(JavaScript 全局范围)中处理可变状态,那么您可以简单地创建一个新上下文并使用引擎的相同全局变量:
ScriptContext engineContext = engine.getContext()
ScriptContext context = new SimpleScriptContext();
context.setBindings(
engineContext.getBindings(ScriptContext.ENGINE_SCOPE),
ScriptContext.ENGINE_SCOPE
);
engine.eval(myScript, myContext);
我有一个文件夹,可以包含任意数量的脚本,这些脚本可以作为咒语使用。这些脚本文件中的代码对于其中的大多数来说都非常少。
一个简单的咒语可能包含:
- Return 姓名
- Return 伤害
- 显示效果
- Launch/control弹丸
更高级的可能会改变地形或类似的东西。
Spell
classJava
端调用脚本中的cast函数
我想知道的是执行此操作的不同方法及其优缺点。我现在看到的方式是:施放咒语时创建一个新的 ScriptEngine
对象,完成后销毁它。
我认为不可能在现有的 ScriptEngine
上设置新的 ScriptContext
,因为该咒语可能还没有完成施法,在施放下一个咒语之前,除非我实施某种排队系统。
与其每次都创建一个新的脚本引擎,不如维护一个 ScriptEngine
实例并且每次只创建一个新的上下文(使用新的全局变量)。然后在该上下文中评估您的脚本:
ScriptContext context = new SimpleScriptContext();
context.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE);
engine.eval(script, context);
如果您的脚本不在全局范围(JavaScript 全局范围)中处理可变状态,那么您可以简单地创建一个新上下文并使用引擎的相同全局变量:
ScriptContext engineContext = engine.getContext()
ScriptContext context = new SimpleScriptContext();
context.setBindings(
engineContext.getBindings(ScriptContext.ENGINE_SCOPE),
ScriptContext.ENGINE_SCOPE
);
engine.eval(myScript, myContext);