【问题标题】:Creating callback functions in Lua在 Lua 中创建回调函数
【发布时间】:2011-05-30 10:30:21
【问题描述】:

我有一个 c++ 类,它在屏幕上组织可以绘制的部分,称为 Canvases。

我想从 Lua 中创建这些画布(我已经这样做了),C++ 代码会跟踪它们并将它们呈现到屏幕上。

但是要绘制到画布中,我希望能够从 LUA 中获得它,所以我想说的是:

local c1 = foo.createCanvas("test", 60, 60, 300, 200);
c1:onPaint = function(params)
  self:clear(1, 0, 0, 1);
  self:moveTo(10, 10);
  self:lineTo(100, 100);
end

createCanvas是foo里面的函数,clear、moveTo、lineTo是createCanvas创建的canvas对象的函数。

所以现在,当 foo 开始渲染所有内容时,它应该看到已经在画布“test”中定义了一个 onPaint 函数,并且应该在渲染到屏幕之前首先调用这个函数。

我应该怎么做?

canvas 是 C++ 中的 lua 元表对象,声明了 __index 和 __newindex。我认为我应该使用 __newindex 来发现 onPaint 将被定义。如何获得这个功能?

boost::shared_ptr<Canvas> **pppCanvas = (boost::shared_ptr<Canvas> **)luaL_checkudata(L, 1, "Canvas");
std::string key = lua_tostring(L, 2);
if (key == "onPaint")
{
    // sometype x = lua_tofunction(L, 3);???
}
else
    luaL_error(L, "Canvas - member '%s' is not defined", key.c_str());
return 0;

那么我应该使用什么类型,我应该使用什么函数来获取这个函数呢?

然后,我将如何调用这个 lua 函数?以及如何确定函数是否已被定义?

编辑:

我找到了这个话题:click 它展示了如何引用一个 lua 函数并稍后再询问它。 现在唯一的问题是:luaL_ref 没有取栈索引,所以我上面的__newindex函数不知道怎么从栈中取函数。

我的问题现在解决了(由于声誉低,似乎无法解决这个问题),因为我实际上需要堆栈中的最后一项。但我想知道是否有人知道我如何在堆栈中取出另一个项目。

无论如何:问题已解决

D.

【问题讨论】:

  • 你考虑过使用 SWIG 吗?这对这种集成很有帮助。见swig.org
  • 不,这不是一个选项。 LUA 集成是从头开始编写的,并且已经有很多代码。我确信我的问题有一个简单的解决方案。

标签: c++ callback lua


【解决方案1】:

看来您可以使用lua_call 来满足您的需求。请注意,swig 不支持 lua afaik 中的 director,因此不是一个选项。

编辑: 根据您的示例更新:

lua_getfield(L, LUA_GLOBALSINDEX, "myLuaFunctionToCall"); /* function to be called */
lua_pushinteger(L, 3); // parameter is 3
lua_call(L, 1, 1); //call with 1 parameter, 1 result
lua_getfield(L, LUA_GLOBALSINDEX, "myLuaFunctionToCall"); /* function to be called */
lua_Number result = lua_tonumber(L,1)

【讨论】:

  • 否:在这种情况下,应该知道回调函数的名称,而我希望能够在 LUA 中注册自己的匿名回调函数(以便每个 Canvas 对象都有自己的回调函数)
  • 它只是一个在运行时检查的字符串,没有什么能阻止你注册它而不是硬编码。
猜你喜欢
  • 2013-06-04
  • 2016-04-29
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
  • 2018-12-11
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多