我有一个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.
你考虑使用痛饮: 根据你的榜样更新?这对于这种整合非常有帮助。请参阅http://www.swig.org/ – vines 2011-05-30 10:36:52
不,这不是一个选项。 LUA集成已经从头开始编写,并且很多代码已经存在。我相信对于我的问题有一个简单的解决方案。 – scippie 2011-05-30 11:02:27