文档章节

Java中的script引擎在游戏中的使用

ksfzhaohui
 ksfzhaohui
发布于 2015/11/07 18:43
字数 860
阅读 1K
收藏 7

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

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可以扩展支持这么多脚本,下面举几个实际运用的例子:

     1.比如有这样的需求,有一个给玩家的奖励是要根据玩家等级(level)进行计算的,比如需要把100*level,这里我们可以使用两种方式来解决:
     第一种:在代码里面写死,判断当是指定奖励的时候*level
     第二种:使用表达式,然后使用引擎执行表达式,看下面的例子,使用JavaScript引擎:

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.还有更复杂的需求,就是战斗系统,不仅仅是解析表达式了,需要更多的逻辑,比如最常用的计算伤害,需要一个很复杂的逻辑,而这个逻辑最清楚的是策划,所以我们通过提供接口,然后由脚本来实现,我们的程序只负责调用就行了。

比如这个接口由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,都是解释执行的,不需要编译,所有现在游戏中经常用脚本来实现热更新。

© 著作权归作者所有

ksfzhaohui

ksfzhaohui

粉丝 418
博文 164
码字总数 254836
作品 3
南京
高级程序员
私信 提问
加载中

评论(2)

-琴兽-
-琴兽-
用过ScriptEngineManager解析js脚本,太慢了!感觉还是jexl解析的时候比较快
lnwazg
lnwazg
如何做到热更新呢?脚本文件每次执行的时候都会重新读取一遍吗?
OGEngine:Java程序员也能开发iOS游戏

据统计,去年游戏行业总销售额为837以元,其中手游行业达112亿元;今年整个游戏行业将突破千亿元,手游预计达250亿元。手游行业的快速发展,让越来越多的开发者加入。 游戏开发首要需要选择游...

橙游OrangeGame
2014/08/25
1.6K
5
在服务器端运行JavaScript文件(一)

简介: 把JavaScript脚本与服务器上Java代码相结合,从而获得在服务器端和客户端都能够自由使用的JavaScript脚本。另外,经过这一系列的被展现技术,无论是基于Ajax还是非Ajax的客户端,都将...

长平狐
2012/10/16
1.1K
0
Android 8款开源游戏引擎

1、Angle (2D Java) Angle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGLES技术开发。该引擎全部用Java代码编写,并且可以根据自己的需要替换里面的实现,缺陷...

晨曦之光
2012/03/01
1.4K
1
Android 8款开源游戏引擎

1、Angle (2D Java) Angle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGLES技术开发。该引擎全部用Java代码编写,并且可以根据自己的需要替换里面的实现,缺陷...

长平狐
2013/01/06
96
0
六大手游开发引擎优劣分析

近几年来,移动互联网的兴起,也让手游产业飞速发展;更多的手游引擎也开始崭露头角,Cocos2d, libgdx, OGEngine等这些名字,也逐渐被开发者所熟知。 下面我们就来对比分析一下主流的手游开发...

橙游OrangeGame
2014/08/25
3K
4

没有更多内容

加载失败,请刷新页面

加载更多

5G改变物联网解决方案的6种方式

简介: 5G的实施将促进更顺畅、更强大和多层网络的发展。这将如何影响物联网解决方案领域?首先,它将加速智慧城市的曙光。 为什么5G是最近记忆中最迫切期待的技术之一,为什么它在地缘政治上...

osc_lyz4aksj
5分钟前
17
0
归一化激活层的进化:谷歌Quoc Le等人利用AutoML 技术发现新型ML模块 - 知乎

最近,谷歌大脑团队和 DeepMind 合作发布了一篇论文,利用 AutoML 技术实现了归一化激活层的进化,找出了 BatchNorm-ReLU 的替代方案 EvoNorms,在 ImageNet 上获得 77.8% 的准确率,超越 BN...

osc_l9a67e5j
6分钟前
10
0
淘宝运营之SEO的三大误区

哈喽大家好,我是大毛!继上一集我说到关于淘宝搜索并提到了SEO,那么我今天再来补充一下,关于淘宝SEO的三大误区。有人说,价格越低越能找到我家的宝贝,这种思想就是不行滴伙计!把价格放低...

osc_k3vwonkw
7分钟前
15
0
多用户商城系统开发要注意什么?

  商城系统开发要注意什么?随着互联网发展,电子商务空前繁荣,以淘宝京东为代表的商城系统大受追捧,同时也方便了人们生活。那么商城系统开发要注意什么呢?大商创B2B2C多用户商城系统开...

大商创多用户商城
7分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部