我该如何在C++类与Lua之间共享变量?

我对Lua还比较新,我一直在尝试为我正在开发的游戏引擎实现Lua脚本逻辑。到目前为止,我没有遇到任何问题,可以通过引擎运行Lua,并且可以从C中调用Lua函数,也可以从Lua调用C函数。

现在引擎的工作方式是,每个对象类都包含一组变量,引擎可以快速迭代以绘制或处理物理效果。虽然游戏对象都需要访问和操纵这些变量,以便游戏引擎本身可以看到任何更改,但他们可以自由地创建自己的变量,Lua非常灵活,所以我不预见任何问题。

无论如何,目前游戏引擎方面都位于C领域,出于性能原因,我真的希望它们留在那里。因此,在理想的情况下,当生成新的游戏对象时,我需要能够将Lua读写访问这些标准变量作为Lua对象的基类的一部分,然后其游戏逻辑可以继续完全运行。

到目前为止,我保留了两个独立的对象表- Lua生成一个新的游戏对象,将其添加到数字索引的全局对象表中,然后继续调用C++函数,该函数创建一个新的GameObject类并向该类注册Lua索引(int)。到目前为止一切顺利,C++函数现在可以看到Lua对象,并且可以轻松执行操作或使用dostring在Lua地域中调用函数。

现在我需要做的是将GameObject类的C++变量公开给Lua,这就是Google无法帮助我的地方。我遇到了一种非常好的方法(这里)详细介绍了使用标签的过程,但我已经读到该方法已弃用,而推荐使用元表。

实现这一点的理想方法是什么?值得学习如何使用libBind或某种等效方法传递类定义吗,还是有一个简单的方法可以在生成时向全局Lua对象注册每个变量(仅一次)?截至Lua 5.1.4目前的最佳实践是什么?

原文链接 https://stackoverflow.com/questions/2677913

点赞
stackoverflow用户33252
stackoverflow用户33252

一种方法是使用

  • 指向C++变量的lightuserdata
  • 使用C函数来访问lightuserdata中的C++变量
  • 将lightuserdata作为C函数的upvalue,因此一个函数就足够了
  • 通过函数的参数数量选择是获取还是设置变量

例如:

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;
    }
}

当你创建一个新的游戏状态时,你可以使用下面的代码为每个变量创建访问器:

lua_pushlightuserdata(L, (int *)p); // p是指向你的变量的指针
lua_pushcclosure(L, game_state_var_accessor, 1);

访问器现在在堆栈上,可以绑定到全局名称或Lua类中方法名称的名称。如果你的Lua类表在索引t上,那么这将是:

lua_setfield(L, t, "name_of_accessor");
2010-04-21 03:08:22