1

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

结构.js

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

function OnLoop() {
    // Every loop
}

function ClickEvent() {
   // Someone clicked me
}

// Other fun functions

现在,假设我有:“BadGuy.js”、“ReallyReallyBadGuy.js”、“OtherBadGuy.js”——就结构而言,它们都与上述类似。在游戏中,每当发生事件时,我都想调用适当的函数。

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

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

坏人.js

var BadGuy = new Object();

BadGuy.ClickEvent = function() {
}
4

1 回答 1

-1

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

  1. 获取 Rhino 引擎的一个实例。
  2. 发出 eval(script) 语句以向引擎添加新的 JS 对象,以及您希望这些对象支持的不同行为(或功能)。
  3. 您有几种不同的选择来调用每个“人”,但只要每个“人”都有一个唯一的名称,您就可以始终按名称引用它们并针对它调用命名方法。
  4. 对于对性能更敏感的操作(可能是某种基于循环的事件循环),您可以在同一引擎中预编译脚本,然后无需重新评估源即可执行该脚本。

这是我在 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();
于 2011-07-23T21:42:39.913 回答