2015-11-05 36 views
0

我有可以含有用作咒语脚本的任意数量的文件夹。这些脚本文件中的大部分代码都非常少。使用多个ScriptEngines

一个简单的咒语可能包含:

  • 返回名称
  • 返回损坏
  • 显示效果
  • 发射/控制弹丸

的更高级的可能改变地形或类似的东西。

JavaSpell类调​​用脚本投功能。

我想知道的是这样做的,他们的优点&利弊的不同方式。现在我看到这一权利的方法是:创建一个新的ScriptEngine对象的时候,法术施放,摧毁它,当它完成。

我不认为这是有可能在现有的ScriptEngine设置新ScriptContext因为法术可能无法完成的铸造呢,除非之前我实现某种形式的排队系统的下一个法术铸造。

回答

0

不是每次都创建一个新的脚本引擎,保持单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);