首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用javax.script运行多个脚本的有效方法

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

Stack Overflow用户
提问于 2011-04-11 13:17:21
回答 1查看 479关注 0票数 1

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

structure.js

代码语言:javascript
复制
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

代码语言:javascript
复制
var BadGuy = new Object();

BadGuy.ClickEvent = function() {
}
EN

回答 1

Stack Overflow用户

发布于 2011-07-23 21:42:39

我不认为你需要为每一个“家伙”创建一个新的ScriptEngine。你可以用一个引擎来管理它们。所以先为屠杀你的游戏场景道歉……

  1. 获得了Rhino引擎的一个实例。
  2. 会发出

(脚本)语句向引擎中添加新的JS对象,以及您希望这些对象支持的不同行为(或函数)。

  1. 对每个对象都有几种不同的调用选择,但只要每个“家伙”都有一个惟一的名称,对于性能敏感的操作(可能是某种基于圆的事件循环),您可以在同一个引擎中预编译脚本,然后可以执行该脚本,而不必重新评估源.

下面是我用Groovy编写的一个示例。

代码语言:javascript
复制
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();
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5621905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档