【发布时间】: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 集成是从头开始编写的,并且已经有很多代码。我确信我的问题有一个简单的解决方案。