LuaBind: Как привязать конкретный экземпляр класса к Lua? - PullRequest
9 голосов
/ 20 сентября 2011

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

Привязка целых классов к 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?

1 Ответ

18 голосов
/ 20 сентября 2011

Вы не привязываете экземпляры классов к 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.

...