创建属性和方法 Lua C++

我正在尝试使用C++在Lua中注册对象的属性和方法。

这是我想在Lua中实现的内容:

player = createPlayer()
player:jump() // 方法
player.x = player.x + 3 // 属性

我可以使用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;
}

但是我如何为createPlayer创建方法 :jump()和属性 .setX.getX

点赞
用户847349
用户847349

您可能搜索的是“将 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 上实时查看整个内容。

2014-08-08 13:41:49