Создание свойств и методов Lua Stack Overflow

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

Я пытаюсь зарегистрировать свойства и методы объекта в 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?

3

Решение

То, что вы могли бы искать, это «Привязка 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

0

Другие решения


По вопросам рекламы [email protected]