Это довольно сложно объяснить, и я не смог найти ничего по этому поводу в документации или где-либо в сети, поэтому я подумал, что это подходящее место для этого вопроса.
Я пытаюсь зарегистрировать свойства и методы объекта в 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
?
То, что вы могли бы искать, это «Привязка 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
Вы можете увидеть все это в прямом эфире на Трэвис-CI