У меня есть класс 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 - это функция объекта canvas, который создается createCanvas.
Так что теперь, когда foo начинает рендеринг всего, он должен увидеть, что функция onPaint была определена в canvas «test» и что эту функцию следует сначала вызвать перед рендерингом на экран.
Как мне это сделать?
холст является метатализируемым объектом lua в C ++ с объявленными __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-функцию? И как я узнаю, была ли функция определена в первую очередь?
EDIT:
Я нашел эту тему: нажмите
Он показывает, как сделать ссылку на lua-функцию и попросить об этом позже.
Единственная проблема сейчас: luaL_ref не берет индекс стека, поэтому я не знаю, как извлечь функцию из стека в моей вышеупомянутой функции __newindex.
Моя проблема решена (кажется, не могу решить эту проблему из-за низкой репутации), потому что мне действительно нужен последний элемент в стеке. Но я хотел бы знать, знает ли кто-нибудь, как я могу взять другой предмет в стеке.
В любом случае: ПРОБЛЕМА РЕШЕНА
D.