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文件又会导致文件过多,监视起来开销也大。所以就不选在通过编译脚本来提高运行速度了

posted @ 2013-07-19 12:04  GTai  阅读(350)  评论(0编辑  收藏  举报