2011-05-30 72 views
1

我有一个C++类,它可以组织屏幕上可以绘制的部分,称为Canvases。在Lua中创建回调函数

我想从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的,明确的,的moveTo功能,lineTo是由createCanvas创建的画布对象的函数。

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

我该怎么做?

画布是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.

+0

你考虑使用痛饮: 根据你的榜样更新?这对于这种整合非常有帮助。请参阅http://www.swig.org/ – vines 2011-05-30 10:36:52

+1

不,这不是一个选项。 LUA集成已经从头开始编写,并且很多代码已经存在。我相信对于我的问题有一个简单的解决方案。 – scippie 2011-05-30 11:02:27

回答

1

看来你可以使用lua_call以满足您的需求。请注意,swig不支持lua afaik中的导演,因此不是一种选择。

编辑

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) 
+0

需要更多信息... – scippie 2011-05-30 11:13:37

+0

否:在这种情况下,应该知道回调函数的名称,但我希望能够在LUA中注册我自己的anonymouse回调函数(以便每个Canvas对象都有自己的回调函数) – scippie 2011-05-30 11:27:16

+0

这只是一个字符串,它是在运行时检查,没有什么阻止你注册它而不是硬编码。 – Bruce 2011-05-30 14:24:54