gpt4 book ai didi

c++ - 创建属性和方法 Lua C++

转载 作者:太空狗 更新时间:2023-10-29 23:20:34 25 4
gpt4 key购买 nike

这很难解释,而且我在文档中或网络上的任何地方都找不到任何关于此的内容,所以我认为这将是一个适合这个问题的地方。

我正在尝试使用 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;
}

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

最佳答案

您可以搜索“将 C++ 绑定(bind)到 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 创建绑定(bind)无需自己为每个绑定(bind)成员编写样板:

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 状态包装器 LuaState ,然后您可以打开一个 Lua 状态并执行绑定(bind):

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 上看到全部内容。

关于c++ - 创建属性和方法 Lua C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25186098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com