6.游戏特别离不开脚本(3)-JS脚本操作java(3)(直接操作JS文件或者调用函数)
java直接运行JS脚本文件的语句,游戏开发时,策划的配置文件什么的就可以分开管理了,游戏逻辑也是一样,比如:一个功能一个脚本或者一个系统一个脚本。
import java.io.FileNotFoundException; import java.io.FileReader; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class UseJsFile { public static void main(String[] args) { ScriptEngineManager eManager = new ScriptEngineManager(); ScriptEngine engine = eManager.getEngineByName("javascript"); { //这里测试运行js文件代码,在src下建了文件,打印语句hello world try { engine.eval(new FileReader("src/test.js")); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (ScriptException e) { e.printStackTrace(); } } } }
当需要多次调用需要提高脚本执行速度时可以对脚本进行编译,但却会失去脚本灵活性的优点:(如果另外提供一个监控文件变化的系统JDK7,当JS文件发生变化时进行重新编译,也许会是个不错的选择。也会有另外的性能开销)
import java.io.FileNotFoundException; import java.io.FileReader; import javax.script.Compilable; import javax.script.CompiledScript; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class UseJsFile { public static void main(String[] args) { ScriptEngineManager eManager = new ScriptEngineManager(); ScriptEngine engine = eManager.getEngineByName("javascript"); Compilable compEngine = null; if (engine instanceof Compilable){ compEngine = (Compilable) engine; } CompiledScript csScript = null; { //这里测试运行js文件代码,在src下建了文件,打印语句hello world try { csScript = compEngine.compile(new FileReader("src/test.js")); csScript.eval(); csScript.eval();//适合多调用几次,提高速度, 但就一定会失去灵活性的有点 } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (ScriptException e1) { e1.printStackTrace(); } } } }
调用JS文件中的方法:
import java.io.FileNotFoundException; import java.io.FileReader; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class UseJsFile { public static void main(String[] args) { ScriptEngineManager eManager = new ScriptEngineManager(); ScriptEngine engine = eManager.getEngineByName("javascript"); { //这里测试运行js文件代码,在src下建了文件,打印语句hello world try { engine.eval(new FileReader("src/test.js")); Invocable invoEngine = (Invocable)engine; invoEngine.invokeFunction("callMe"); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (ScriptException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } } } }
结果是:
i was called
附:由于不知道java怎么调用编译过的脚本的某个具体方法,而在游戏中讲一个功能设置为一个js文件又会导致文件过多,监视起来开销也大。所以就不选在通过编译脚本来提高运行速度了