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

转载于:https://www.cnblogs.com/booke/p/3200287.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值