作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 javax.script for AI 开发基于 java 的游戏;
public class AI implements Runnable {
private boolean alive = true;
String scriptStr;
ScriptEngine scriptEngine;
ScriptContext scriptContext;
Bindings engineScope;
public AI() {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
scriptEngine = scriptEngineManager.getEngineByName("JavaScript");
scriptContext = new SimpleScriptContext();
engineScope = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
engineScope.put("scene", Scene.instance);
try {
scriptStr = new Scanner(new File(getClass().getResource("ai.js").getPath())).useDelimiter("\\Z").next();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (alive) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Iterable<IUnit> units = Scene.instance.getUnits();
for (IUnit unit : units) {
if (unit.isAlive()) {
engineScope.put("unit", unit);
try {
scriptEngine.eval(scriptStr, scriptContext);
} catch (ScriptException e) {
e.printStackTrace();
}
}
}
}
}
}
最佳答案
我使用单个 ScriptEngine 和每次执行一个 SimpleScriptContext 来完成此操作 - 尽管它可能是每个线程。
创建上下文后,您必须在该上下文中执行它,然后它才能被您的 scriptlet 使用。
为了优化库的重复包含,我在创建 ScriptEngine 时将其编译为 CompiledScript 一次。
我编译每个 scriptlet 对象,然后使用 eval(context) 方法来执行它们。
这在我的测试中足以创建线程安全。
关于java - 如何在 java ScriptEngine 的每个 eval 上提供单独的上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18211724/
我是一名优秀的程序员,十分优秀!