Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javax.script运行多个脚本的有效方法_Javax.script - Fatal编程技术网

使用javax.script运行多个脚本的有效方法

使用javax.script运行多个脚本的有效方法,javax.script,Javax.script,我正在开发一个游戏,我希望有多个脚本都实现相同的结构。每个脚本都需要在自己的范围内运行,这样代码就不会与其他脚本重叠。例如: structure.js function OnInit() { // Define resources to load, collision vars, etc. } function OnLoop() { // Every loop } function ClickEvent() { // Someone clicked me } // O

我正在开发一个游戏,我希望有多个脚本都实现相同的结构。每个脚本都需要在自己的范围内运行,这样代码就不会与其他脚本重叠。例如:

structure.js

function OnInit() {
    // Define resources to load, collision vars, etc.
}

function OnLoop() {
    // Every loop
}

function ClickEvent() {
   // Someone clicked me
}

// Other fun functions
var BadGuy = new Object();

BadGuy.ClickEvent = function() {
}
现在,让我们假设我有:“BadGuy.js”、“ReallyReallyBadGuy.js”、“OtherBadGuy.js”-它们在结构上都与上面的一样。在游戏中,每当事件发生时,我都会调用相应的函数

问题在于效率和速度。我通过为每个脚本实例创建一个引擎(使用
getEngineByName
)找到了一个可行的解决方案,但这对我来说并不理想

如果没有更好的解决方案,我可能会求助于每个脚本都有自己独特的类/函数名。即

BadGuy.js

function OnInit() {
    // Define resources to load, collision vars, etc.
}

function OnLoop() {
    // Every loop
}

function ClickEvent() {
   // Someone clicked me
}

// Other fun functions
var BadGuy = new Object();

BadGuy.ClickEvent = function() {
}

我不认为你需要为每个“家伙”创建一个新的脚本引擎。您可以在一个引擎中管理它们。因此,提前为屠杀你的游戏场景道歉

  • 获取Rhino引擎的一个实例
  • 发出eval(script)语句,向引擎添加新的JS对象,以及希望这些对象支持的不同行为(或功能)
  • 您有两个不同的选择来针对每个人进行调用,但只要每个“家伙”都有一个唯一的名称,您就可以始终按名称引用它们,并针对它们调用一个命名方法
  • 对于性能更敏感的操作(可能是某种基于循环的事件循环),您可以在同一个引擎中预编译脚本,然后在不必重新计算源代码的情况下执行该脚本
  • 这是我用Groovy编写的一个示例

    import javax.script.*;
    sem = new ScriptEngineManager();
    engine = sem.getEngineByExtension("js");
    engine.getBindings(ScriptContext.ENGINE_SCOPE).put("out", System.out);
    eventLoop = "for(guy in allGuys) { out.println(allGuys[guy].Action(action)); }; "
    engine.eval("var allGuys = []");
    engine.eval("var BadGuy = new Object(); allGuys.push(BadGuy); BadGuy.ClickEvent = function() { return 'I am a BadGuy' }; BadGuy.Action = function(activity) { return 'I am doing ' + activity + ' in a BAD way' }");
    engine.eval("var GoodGuy = new Object(); allGuys.push(GoodGuy); GoodGuy.ClickEvent = function() { return 'I am a GoodGuy' }; GoodGuy.Action = function(activity) { return 'I am doing ' + activity + ' in a GOOD way' }");
    CompiledScript executeEvents = engine.compile(eventLoop);
    println engine.invokeMethod(engine.get("BadGuy"), "ClickEvent");
    println engine.invokeMethod(engine.get("GoodGuy"), "ClickEvent");
    engine.getBindings(ScriptContext.ENGINE_SCOPE).put("action", "knitting");
    executeEvents.eval();