解释起来相当棘手,我在文档中或网上的任何地方都找不到任何内容,所以我觉得这个问题适合这个问题。
我试图使用C ++在Lua中的对象上注册属性和方法。
这是我在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
?
答案 0 :(得分:0)
你可以搜索的是“将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
看到整个事情