我正在开发一个游戏,我希望有多个脚本都实现相同的结构。每个脚本都需要在自己的范围内运行,以便代码不会与其他脚本重叠。例如:
structure.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
)找到了一个有效的解决方案,但这对我来说似乎并不理想。
如果没有更好的解决方案,我可能会使用每个脚本都有自己独特的类/函数名称。即。
BadGuy.js
var BadGuy = new Object();
BadGuy.ClickEvent = function() {
}
答案 0 :(得分:-1)
我认为你不需要为每个“Guy”创建一个新的ScriptEngine。您可以在一个引擎中管理它们。因此,对于屠杀你的游戏场景提前道歉......
这是我在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();