在Lua中创建回调函数

时间:2011-05-30 10:30:22

标签: c++ callback 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创建的canvas对象的函数。

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

我该怎么做?

canvas是C ++中的lua metatable对象,声明了__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

1 个答案:

答案 0 :(得分: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)