Java中的script引擎在遊戲中的使用

      首先查看一下jvm當前支持了哪些腳本引擎,當前使用的是jdk6版本 javascript

ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
List<ScriptEngineFactory> engineFactories = scriptEngineManager.getEngineFactories();
if (engineFactories.size() == 0) {
        System.out.println("本JVM尚不支持任何腳本引擎");
        return;
}
System.out.println("本JVM支持的腳本引擎有:");
for (ScriptEngineFactory engineFactory : engineFactories) {
	System.out.println("引擎名稱:" + engineFactory.getEngineName());
	System.out.println("\t可被ScriptEngineManager識別的名稱:"+ engineFactory.getNames());
}
結果:
本JVM支持的腳本引擎有:
引擎名稱:Mozilla Rhino
    可被ScriptEngineManager識別的名稱:[js, rhino, JavaScript, javascript, ECMAScript, ecmascript]
      能夠知道jvm默認是支持JavaScript腳本的,固然jvm提供了相應的接口,是能夠接入第三方腳本引擎的,好比Python,  Expression Language等支持。當前引用了jython.jar,jython-engine.jar,jexl.jar,從新查看支持的引擎。

本JVM支持的腳本引擎有:
引擎名稱:Mozilla Rhino
    可被ScriptEngineManager識別的名稱:[js, rhino, JavaScript, javascript, ECMAScript, ecmascript]
引擎名稱:jython
    可被ScriptEngineManager識別的名稱:[jython, python]
引擎名稱:JEXL Engine
    可被ScriptEngineManager識別的名稱:[JEXL, Jexl, jexl, JEXL2, Jexl2, jexl2]

好了,既然jvm能夠擴展支持這麼多腳本,下面舉幾個實際運用的例子: java

     1.好比有這樣的需求,有一個給玩家的獎勵是要根據玩家等級(level)進行計算的,好比須要把100*level,這裏咱們可使用兩種方式來解決:
     第一種:在代碼裏面寫死,判斷當是指定獎勵的時候*level
     第二種:使用表達式,而後使用引擎執行表達式,看下面的例子,使用JavaScript引擎:
python

ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("javascript");
String exp = "100 * level";
scriptEngine.put("level", 4);
Object result = scriptEngine.eval(exp);
System.out.println(exp + " = " + result);
這樣咱們就能夠將咱們的獎勵表達式,交給一個表達式處理器統一處理。這裏咱們是利用了JavaScript能夠執行表達式的功能,固然能夠利用更專業的表達式執行引擎jexl,性能會更好。
ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("jexl");

      2.還有更復雜的需求,就是戰鬥系統,不單單是解析表達式了,須要更多的邏輯,好比最經常使用的計算傷害,須要一個很複雜的邏輯,而這個邏輯最清楚的是策劃,因此咱們經過提供接口,而後由腳原本實現,咱們的程序只負責調用就好了。 ecmascript

好比這個接口由Python來實現:
def increaseHp(attackUnit,defenceUnit,skill,buff,type):#attackUnit 技能釋放者,defenceUnit 技能中招者,skill 技能,buff ,type 1=求數值 2=求描述
....省略
經過一系列的參數最後計算出傷害。
或者看一個更簡單的Python腳本test.py:
def addition(num1,num2):
    return num1+num2;
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("python");

String jsFileName = "scripts/test.py"; // 讀取py文件
FileReader reader = new FileReader(jsFileName); // 執行指定腳本
engine.eval(reader);
if (engine instanceof Invocable) {
	Invocable invoke = (Invocable) engine;
	Integer c = (Integer) invoke.invokeFunction("addition", 2, 3);
	System.out.println("c = " + c);
}
好了,暫且就介紹這兩種需求了,確定還有運用在其餘的地方的需求。

忘了說了腳本好比JavaScript,Python,lua,都是解釋執行的,不須要編譯,全部如今遊戲中常常用腳原本實現熱更新。 jvm

相關文章
相關標籤/搜索