本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2017/01/15/libgdx-with-lua-support/
Lua确实是一个非常常用的脚本,很多时候处于快速更新应用或者游戏AI自身所需,我们必须在游戏中集成脚本支持。而Lua是一个不错的选择。
Lua语言规范精简、运行时库小,非常容易创建受控环境,安全性也不错。虽然是一个小巧的脚本语言,但是支持协程,能够在关键时刻发挥很大作用。
要在libGDX中集成Lua非常简单,只需要选择一款java实现的Lua运行环境即可。本文以luaj为例。
首先在build.gradle中添加依赖
compile "org.luaj:luaj-jse:3.0.1"
然后在选择需要调用的地方,这里来个简单的例子,我们需要在stage初始化时添加一个Image对象,而Image对象的资源来自TextureAtlas类,为了演示的完整性,我们还会把Lua脚本执行结果赋值给Java上下文。
这是原有的Java代码
atlas = DartsGame.getManager().get("pack/sha/default.pack", TextureAtlas.class); // 获取图册
man = new Image(atlas.findRegion(PLAYER)); // 获取图册中的Player.png并创建image对象
man.setName("player");
man.setX(0);
man.setY(160 - man.getHeight() / 2); // 设置Y值,以让图片在中间显示
stage.addActor(man); // 将主角添加到舞台
新创建一个Lua脚本
function man(stage, atlas)
man = luajava.newInstance("com.badlogic.gdx.scenes.scene2d.ui.Image", atlas:findRegion("Player"))
man:setName("player")
man:setX(0)
man:setY(160 - man:getHeight() / 2)
stage:addActor(man)
return man
end
这里我们return man是为了演示Lua脚本和Java宿主的交互,并没有太多实际的意义。
然后返回Java代码,一般我们会在一些常见的地方添加脚本调用点,但是对应的调用可以为空,一般我会选择Stage初始化的时候,Stage update的时候。然后会传入一些常见的Java对象给予Lua脚本,常见的包括stage和assetManager。
Globals globals = JsePlatform.standardGlobals();
LuaValue load = globals.load(Gdx.files.local("man.lua").readString());
load.call();
Varargs varargs = globals.get("man").invoke(new LuaValue[] {
CoerceJavaToLua.coerce(stage),
CoerceJavaToLua.coerce(atlas)
});
man = (Image) CoerceLuaToJava.coerce(varargs.arg1(), Image.class);
这里需要注意的是CoerceJavaToLua和CoerceLuaToJava两个类,它们分别提供了Java对象转Lua对象和Lua对象转Java对象的功能。因为Lua默认支持的类型非常少,所以大部分时候LuaValue.of是不够用的。这两个类其实使用了userdatas作为传递对象,直接将Java的对象放入userdatas中,并保持class的信息。
public Object coerce(LuaValue value) {
switch (value.type()) {
case LuaValue.TNUMBER:
return value.isint() ? (Object) new Integer(value.toint()) : (Object) new Double(value.todouble());
case LuaValue.TBOOLEAN:
return value.toboolean() ? Boolean.TRUE: Boolean.FALSE;
case LuaValue.TSTRING:
return value.tojstring();
case LuaValue.TUSERDATA:
return value.optuserdata(targetType, null);
case LuaValue.TNIL:
return null;
default:
return value;
}
}
因为coerce也支持普通Lua类型,所以可以放心使用。
另外Intellij有Lua脚本插件,所以写起来还好

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载自夜明的孤行灯
本文链接地址: https://www.huangyunkun.com/2017/01/15/libgdx-with-lua-support/
感觉好麻烦…
灯神写得总是这么言简意赅。。。
🙂
coerce是什么?
luaj内部类型mapping的一个东西吧,具体为啥这样命名,没有深究