LuaBind: как связать конкретный экземпляр класса с Lua?

(примечание: это игровое программирование)

Привязать целые классы к Lua с помощью LuaBind очень просто:

class test
{
   test()
   {
      std::cout<<"constructed!"<<std::endl;
   }

   void print()
   {
      std::cout<<"works!"<<std::endl;
   }
}

//где-нибудь еще

   module[some_lua_state]
   [
      class_<test>("test")
      .def(constructor<>())
      .def("print",&test::print)
   ];

Теперь я могу создавать экземпляры класса в Lua и использовать их:

lua_example.lua

foo = test() //will print "constructed!" on the console
foo:print()  //will print "works!" on the console

Однако теперь я хотел бы привязать конкретный экземпляр теста к Lua. Это позволило бы мне передавать объекты в Lua, например. экземпляр класса Player и сделайте что-то вроде:

Player:SetPosition(200,300)

В отличие от того, чтобы идти трудным путем и иметь что-то вроде

SetPosition("Player",200,300)

где соответствующая функция C++ SetPosition должна искать std::map, чтобы найти игрока.

Возможно ли это, и если да, то как я могу это сделать в LuaBind?


person TravisG    schedule 20.09.2011    source источник


Ответы (1)


Вы не привязываете экземпляры классов к Lua. Экземпляры классов — это просто данные, и вы можете передавать данные в Lua обычными способами. Однако объекты C++ особенные; поскольку они зарегистрированы через Luabind, вы должны использовать методы Luabind, чтобы предоставить их Lua-скриптам.

Есть несколько способов передать данные в Lua, и Luabind покрывает их все. Например, если у вас есть объект x, который является указателем на класс X, зарегистрированный в Luabind, вы можете передать Lua x несколькими способами.

Вы можете установить значение x в глобальную переменную. Это делается через интерфейс Luabind object и функцию globals:

luabind::globals(L)["NameOfVariable"] = x;

Очевидно, вы можете поместить это в другую таблицу, которая находится в другой таблице и т. д., которая доступна из глобального состояния. Но вам нужно убедиться, что все таблицы существуют.

Другой способ передать эти данные в Lua — вызвать функцию Lua и передать ее в качестве параметра. Вы можете использовать интерфейс luabind::object, чтобы получить функцию как объект, а затем использовать luabind::call_function для ее вызова. Затем вы можете просто передать x в качестве параметра функции. В качестве альтернативы, если вы предпочитаете синтаксис в стиле lua_pcall, вы можете обернуть x в luabind::object и поместить его в стек с помощью luabind::object::push.

person Nicol Bolas    schedule 20.09.2011
comment
Прошло пару часов с тех пор, как вы ответили на него, но еще раз спасибо. luabind::globals делает все это очень и очень простым. Также luabind поднял мое уважение к метапрограммированию шаблонов в C++ на новый уровень. - person TravisG; 21.09.2011