【问题标题】:How to listen to specific function call in Lua from C++?如何从 C++ 监听 Lua 中的特定函数调用?
【发布时间】:2018-07-10 10:19:00
【问题描述】:

假设我有以下 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”函数存在)

这可以做类似的事情吗?

【问题讨论】:

  • 也许你可以利用观察者模式?查看此SO 帖子了解更多详情。

标签: c++ lua listener


【解决方案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;
}

【讨论】:

  • lua_touserdata 返回void *,所以static_cast&lt;MyClass*&gt; 应该足够了。不需要reinterpret_cast(顺便说一下,不在std 命名空间中)。
猜你喜欢
  • 2015-07-14
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
  • 2010-11-15
  • 2018-04-23
  • 1970-01-01
相关资源
最近更新 更多