我应该如何将lua函数绑定到C++函数?

我有一个名为Entity的类,其中有许多功能,例如onPickup,onDrop,onUse等。我想做的是编写一个脚本,定义所有这些函数,并使它们可以从C++函数中调用。因此,C++中定义的函数只是调用具有某些功能的相应Lua函数。

但是问题在于,我希望我编写的每个脚本,针对程序中的每个实体,都能在自己的作用域中工作。

我正在使用LuaBind,并且没有先前使用Lua的经验,所以我有点迷失。

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

点赞
stackoverflow用户416047
stackoverflow用户416047

我不使用lua绑定,但这可能会有所帮助。思路是在C++类中注册lua函数并在C++类中保留对lua函数的引用。

为了定义一个可从C/C++调用的lua函数,我使用luaL_ref在我的C++对象中存储回调函数的引用。

// 一个小助手函数
template <typename T>
T *Lua_getUserData(lua_State *L) {
    assert(lua_isuserdata(L, 1) == 1);
    T **v = (T **) lua_touserdata(L, 1);
    assert(v != NULL);
    return *v;
}

int lua_FormRegisterMethods(lua_State *L) {
    Entity *f = Lua_getUserData<Entity>(L);
    assert(lua_istable(L, 2) == 1); // 检查下一个参数是否为表格
    lua_pushvalue(L,2); // 复制表格
    f->LuaTable = luaL_ref(L, LUA_REGISTRYINDEX); // 保留对表格的引用
    lua_getmetatable(L, 2); // 获取元表
    lua_pushstring(L, "OnClick");
    lua_rawget(L, -2); // 获取OnClick Lua函数
    f->LuaMethod = luaL_ref(L, LUA_REGISTRYINDEX); // 保存对它的引用
    return 0;
}

然后,您可以在C++事件中获取lua方法

lua_rawgeti( LuaInstance->L, LUA_REGISTRYINDEX, LuaMethod );
assert(lua_isfunction(LuaInstance->L, -1) == 1);

现在,您可以使用先前保存的表格作为self来调用此函数。希望对您有所帮助

2011-04-29 12:37:17
stackoverflow用户149988
stackoverflow用户149988

你可以使用以下代码来调用 Lua 函数:

int callLuaFunction(lua_State* lua_state) {
    return luabind::call_function<int>(lua_state, "myluafunction", param1);
}

其中 myluafunction 是 Lua 函数的名称,该函数接受一个参数并返回一个整数。

我确信你可以创建不止一个 lua_State。只需将正确的 lua_State 传递到 call_function 中即可。

2011-04-29 12:40:18