使用 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();
}
}
}
}
}
}
在上面的代码中,我有一个提供迭代单元的场景。我想为所有单元调用相同的 js 代码(“ai.js”),其中单元将确定要做什么。
问题是我希望每个单元都有自己的上下文数据。所以每次我为一个单元评估 ai.js 时,它们都不会是无状态和无记忆的。
正确的方法是什么?
我应该为每个单元明确使用 SpringContext 之类的东西吗?
或者是否可以运行 ai.js,就好像它是 Unit 类上下文中的一个函数一样?