java绑定值到页面script内_Java中的script引擎在游戏中的使用

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

ScriptEngineManager scriptEngineManager = new ScriptEngineManager();

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,我们需要使用Java连接数据库,可以使用JDBC来实现。以下是一个简单的Java代码示例,用于连接MySQL数据库并从其获取数据: ```java // 导入JDBC相关的包 import java.sql.*; // 数据库连接信息 String url = "jdbc:mysql://localhost:3306/mydb"; String username = "root"; String password = "password"; // 获取数据库连接 Connection conn = DriverManager.getConnection(url, username, password); // 查询数据 String sql = "SELECT * FROM mytable"; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); // 处理结果集 while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); int age = rs.getInt("age"); // 处理数据... } // 关闭连接 rs.close(); stmt.close(); conn.close(); ``` 接下来,我们可以将查询到的数据转换成JSON格式,然后返回给前端页面。以下是一个简单的Servlet代码示例,用于接收前端页面的请求并返回数据: ```java // 导入Servlet相关的包 import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.sql.*; import com.google.gson.*; public class MyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 连接数据库 String url = "jdbc:mysql://localhost:3306/mydb"; String username = "root"; String password = "password"; Connection conn = DriverManager.getConnection(url, username, password); // 查询数据 String sql = "SELECT * FROM mytable"; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); // 处理结果集 JsonArray data = new JsonArray(); while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); int age = rs.getInt("age"); // 处理数据... JsonObject item = new JsonObject(); item.addProperty("id", id); item.addProperty("name", name); item.addProperty("age", age); data.add(item); } // 返回数据 JsonObject result = new JsonObject(); result.addProperty("draw", 1); result.addProperty("recordsTotal", data.size()); result.addProperty("recordsFiltered", data.size()); result.add("data", data); response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); PrintWriter out = response.getWriter(); out.print(result.toString()); // 关闭连接 rs.close(); stmt.close(); conn.close(); } } ``` 在这个示例,我们使用了Google Gson库将查询到的数据转换成JSON格式,并将其作为响应返回给前端页面。我们还设置了一些DataTables需要的参数,如`draw`、`recordsTotal`、`recordsFiltered`等。这些参数可以使DataTables正确显示数据。 最后,在前端页面,我们可以使用jQuery和DataTables来从Servlet获取数据并显示在页面上。以下是一个简单的HTML页面代码示例: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>My Page</title> <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.25/css/jquery.dataTables.min.css"> </head> <body> <table id="mytable"> <thead> <tr> <th>ID</th> <th>Name</th> <th>Age</th> </tr> </thead> <tbody></tbody> </table> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="https://cdn.datatables.net/1.10.25/js/jquery.dataTables.min.js"></script> <script> $(document).ready(function() { $("#mytable").DataTable({ "ajax": "MyServlet", "columns": [ {"data": "id"}, {"data": "name"}, {"data": "age"} ] }); }); </script> </body> </html> ``` 当页面加载时,前端页面使用jQuery和DataTables从MyServlet获取数据,并将其显示在表格。DataTables会自动将JSON格式的数据解析成表格的行和列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值