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

时间:2018-07-10 10:19:00

标签: c++ lua listener

假设我有以下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函数。 (如果存在“触摸”功能)

这有可能做类似的事情吗?

1 个答案:

答案 0 :(得分:1)

您可以用自己的函数替换该函数,然后在处理侦听器后在该函数中调用原始函数:

lua_getglobal(L, "touched");
lua_pushlightuserdata(L, this);
lua_pushcclosure(L, &MyClass::touchedFromLua, 2); 
//add  original function and this as 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;
}