将C++方法和变量绑定到表格中,同时显示。

我一直在试图创建一个“主机”应用程序,将C++ API暴露给Lua代码,并且到目前为止取得了相当大的成功,但是当尝试将“变量”与方法绑定时遇到了一些问题。

我开发的将“类”绑定到lua的模式涉及每个类都有一个_new_gc函数,以及每个类的静态luaL_Reg RegData[]。然后,我可以将所需的函数分配给RegData数组,并调用帮助方法将它们绑定到lua。以下是演示我的方法的一些代码:

int Host :: _new(lua_State * ls)
{
    Host ** udata = (Host **) lua_newuserdata(ls, sizeof(Host *);
    * udata = new Host();

    luaL_getmetatable(ls,“luaL_Host);
    lua_setmetatable(ls,-2);

    返回1;
}

int Host :: _gc(lua_State * ls)
{
    Host * host = *(Host **)luaL_checkudata(ls,1,“luaL_Host”);
    删除主机;
    返回0;
}

const luaL_Reg Host :: RegistrationData [] =
{
    {“new”,Host :: _new},
    {“__gc”,Host :: _gc},
    {00}
};

在其他地方:

void LuaState :: registerObject(const char * name,const luaL_Reg data [])
{
    int len = strlen(name)+ 6;
    char * luaLname = new char [len];
    snprintf(luaLname,len,“luaL_%s”,名称);

    //使用正确的函数创建元表
    luaL_newmetatable(_state,luaLname);
    luaL_setfuncs(_state,data,0);

    //在堆栈上复制元表
    lua_pushvalue(_state,-1);
    //将索引分配给副本
    lua_setfield(_state,-1,“__index”);

    //将表暴露为全局“Host”
    lua_setglobal(_state,name);

    删除luaLname;
}

假设我希望我的Lua代码也能查看键盘状态,并且希望Lua代码访问它如下所示:

host = Host.new()
pressed = host.Keyboard.getKeyPressed(1)

复制完全相同的模式,以建立键盘表是很容易的,但是我似乎找不到一个好的方法将该键盘表添加到我的主机表中。有没有简单的方法在不破坏我的模式的情况下这么做?有没有更好的模式应该使用?

我发现了许多关于如何创建各种不同方面的C-Lua API的资源,但是在执行此操作时没有找到太多有关模式/最佳实践的东西。此外,我知道有一些库,例如LuaBind,可以帮助解决此问题,但是宁愿自己制作(至少第一次)。

点赞
用户374691
用户374691

我决定采取更多面向对象/继承的方法来解决这个问题,并计划查看 MOAI SDK 如何实现他们的 Lua API,目前看起来很有前途。

2013-04-22 19:22:15