如何从C++中监听Lua中特定函数的调用?

假设我有以下Lua代码。

function touched(x, y)
end
function moved(x, y)
end
function released(x, y)
end

这些函数通过lua_pcall从C++中调用,因此我也可以在C++中监听这些事件。

但我想知道是否可以添加一个侦听器,根据函数名称在C++中侦听特定的Lua函数。

例如,在C++中可能是以下内容

lua_addlistener(L, "touched", this, &MyClass::touchedFromLua);

然后它可以监听Lua代码中的touched函数。(如果函数"touched"存在)

这是可能实现类似的东西吗?

点赞
用户731620
用户731620

你可以用自己的函数替换这个函数,然后在那个函数中处理监听器后调用原始函数:

lua_getglobal(L, "touched");
lua_pushlightuserdata(L, this);
lua_pushcclosure(L, &MyClass::touchedFromLua, 2);
// 添加原始函数和这个函数作为upvalues
lua_setglobal(L, "touched");

touchedFromLua函数需要是静态的,看起来像这样:

int MyClass::touchedFromLua(Lua_State *L){
    int args = lua_gettop(L);
    MyClass* thiz = std::reinterpret_cast<MyClass*>(lua_touserdata(lua_upvalueindex(2)));
    thiz->touchedFromLua_nonstatic(L);

    lua_pushvalue(lua_upvalueindex(1));
    lua_insert(L, 1);
    lua_call(L, args , LUA_MULTRET);
    int rets = lua_gettop(L);
    return rets;
}
2018-07-10 15:22:15