Nic*_*ynt 4 c++ lua shared-objects
我是Lua的新手,我一直在努力尝试在我正在整合的游戏引擎中实现逻辑的Lua脚本.到目前为止,我已经毫无困难地让Lua启动并运行引擎,我可以从Lua调用C和C函数中的Lua函数.
引擎现在的工作方式,每个Object类都包含一组变量,引擎可以快速迭代这些变量来绘制或处理物理.虽然游戏对象都需要访问和操作这些变量,以便游戏引擎自己看到任何变化,但他们可以自由创建自己的变量,Lua对此非常灵活,所以我不会预见到任何问题.
无论如何,目前游戏引擎方面的东西都坐在C盘中,我真的希望它们留在那里以达到性能的原因.因此,在一个理想的世界中,当产生一个新的游戏对象时,我需要能够让Lua对这个标准变量集的读/写访问权作为Lua对象基类的一部分,然后它的游戏逻辑可以继续狂奔.
到目前为止,我保留了两个独立的对象表--Laa生成了一个新的游戏对象,它将自己添加到一个数字索引的全局对象表中,然后继续调用一个C++函数,它创建一个新的GameObject类和在类中注册Lua索引(一个int).到目前为止,C++函数现在可以看到Lua对象并使用dostring在Lua land中轻松执行操作或调用函数.
我现在需要做的是将C++变量作为GameObject类的一部分,并将它们暴露给Lua,这就是谷歌让我失望的地方.我在这里遇到了一个非常好的方法,它使用标签详细说明了这个过程,但是我已经读过这个方法已被弃用,而不是metatables.
实现这一目标的理想方法是什么?是否值得学习如何使用libBind或一些等效方法传递类定义的麻烦,还是有一种简单的方法我可以用全局lua对象注册每个变量(一次,在产生时)?从Lua 5.1.4开始,"当前"最好的方法是什么?
一种方法是使用
例如:
int game_state_var_accessor (lua_State *L)
{
int *p = lua_topointer(L, lua_upvalueindex(1));
if (lua_gettop(L) == 0)
{ // stack empty, so get
lua_pushinteger(L, *p);
return 1;
}
else
{ // arg provided, so set
*p = lua_tointeger(L,1);
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
当您创建新游戏状态时,您可以使用以下命令为每个变量创建访问者:
lua_pushlightuserdata(L, (int *)p); // where p points to your variable
lua_pushcclosure(L, game_state_var_accessor, 1);
Run Code Online (Sandbox Code Playgroud)
访问器现在位于堆栈上,可以绑定到全局名称,也可以绑定到Lua类中方法的名称.如果你的Lua类表在索引的堆栈上,t那么将是:
lua_setfield(L, t, "name_of_accessor");
Run Code Online (Sandbox Code Playgroud)