在Lua中创建回调函数

我有一个 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 创建的画布对象的函数。

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

我应该怎么做呢?

画布是具有 __index 和 __newindex 声明的 C++ 中的 Lua 元表对象。我认为我应该使用 __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 函数中从堆栈中获取函数。

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

无论如何:问题已解决

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

点赞
stackoverflow用户703531
stackoverflow用户703531

看起来你可以使用lua_call来满足你的需求。请注意,据我所知,swig不支持lua中的director,因此不是一个选择。

EDIT: 根据你的示例更新:

lua_getfield(L, LUA_GLOBALSINDEX, "myLuaFunctionToCall");/*要调用的函数*/
lua_pushinteger(L, 3);//参数为3
lua_call(L, 1, 1);//使用1个参数,1个结果来调用
lua_getfield(L, LUA_GLOBALSINDEX, "myLuaFunctionToCall");/*要调用的函数*/
lua_Number result = lua_tonumber(L,1)
2011-05-30 11:04:51