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

  • 相关阅读:
    Using PL/SQL APIs as Web Services
    1.Cocos2dx 3.2中vector,ValueMap,Touch触摸时间的使用.iconv字符编解码
    我对贝叶斯分类器的理解
    VB.NET的前世今生
    《转》PyQt4 精彩实例分析* 实例2 标准对话框的使用
    网络流合集:bzoj1433,1934,1854 题解
    Android 下拉刷新上拉载入 多种应用场景 超级大放送(上)
    Nginx 笔记与总结(15)nginx 实现反向代理 ( nginx + apache 动静分离)
    深入浅出之数据分析四步曲
    深入浅出之数据分析四步曲
  • 原文地址:https://www.cnblogs.com/booke/p/3200287.html
Copyright © 2011-2022 走看看