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

  • 相关阅读:
    python自动化测试(2)--读取excel中的测试用例并使用列表进行存放
    Numpy学习记录
    Tensorflow环境安装记录--无法识别GPU的问题
    Tensorflow框架学习(1)--CNN的实现
    IDEA创建springboot项目总是创建失败问题的解决
    java_集合知识点小结
    java易错知识点汇总_1
    struts2 中文件的位置问题
    struts2 action中的私有变量
    span 标记 width 设置
  • 原文地址:https://www.cnblogs.com/booke/p/3200287.html
Copyright © 2020-2023  润新知