Создание свойств и методов Lua C++

Это довольно сложно объяснить, и я не смог найти ничего по этому поводу в документации или где-либо еще в сети, поэтому я подумал, что это подходящее место для этого вопроса.

Я пытаюсь зарегистрировать свойства и методы объекта в Lua, используя C++.

Вот чего я пытаюсь достичь в Lua:

player = createPlayer()
player:jump() // method
player.x = player.x + 3 // properties

Я легко могу достичь первой строки в примере, используя C++

int create_player(lua_State *L)
{
    Player* player = new Player();
    ..

    return 0;
}

int main(int args, char * argv[])
{
    lua_State* L = lua_open();
    luaL_openlibs(L);    

    lua_register(L, "createPlayer", create_player);

    luaL_dofile(L, "main.lua");

    ..
    return 0;
}

Но как мне создать метод :jump() и свойства .setX а также .getX за createPlayer?

1 ответ

Решение

То, что вы могли бы искать, это "Привязка C++ к Lua".

Поскольку это довольно популярный вопрос, я выложу ответ с проектом, который можно скомпилировать онлайн:

Начиная с класса C++:

class Player {
  int x;
public:
  Player() : x(0) {}
  int get_x() const { return x; }
  void set_x(int x_) { x = x_; }
  void jump() {}
};

Затем вы можете создавать привязки, используя LuaBridge, не записывая шаблон для каждого из связанных членов:

void luabridge_bind(lua_State *L) {
 luabridge::getGlobalNamespace(L)
 .beginClass<Player>("Player")
  .addConstructor<void (*)(), RefCountedPtr<Player> /* shared c++/lua lifetime */ >()
  .addProperty("x", &Player::get_x, &Player::set_x)
  .addFunction("jump", &Player::jump)
 .endClass()
 ; 
}

Используя специальную оболочку Lua State LuaState, вы можете открыть состояние Lua и выполнить привязки:

lua::State state;
luabridge_bind(state.getState());

Запуск сценария с использованием некоторого вывода трассировки:

try {
  static const char *test =
  "player = Player() \n"
  "player:jump() \n"
  "player.x = player.x + 3"
  ;
  state.doString(test);
}
catch (std::exception &e) {
  std::cerr << e.what() << std::endl;
}

Производит следующий вывод:

Player
jump
get_x
set_x 3
~Player

Вы можете увидеть все это в прямом эфире на Travis-CI

Другие вопросы по тегам