Создание функций обратного вызова в Lua - PullRequest
1 голос
/ 30 мая 2011

У меня есть класс 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.

1 Ответ

1 голос
/ 30 мая 2011

Кажется, вы можете использовать lua_call для удовлетворения ваших потребностей.Обратите внимание, что swig не поддерживает Director в lua afaik и, следовательно, не является опцией.

EDIT : обновлено в соответствии с вашим примером:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...