【问题标题】:How to add namespaces to Lua?如何将命名空间添加到 Lua?
【发布时间】:2020-07-09 07:43:30
【问题描述】:

我在我正在开发的游戏引擎中使用 Lua。我想给 Lua 一种方法来获取和设置脚本所在实体的位置。该脚本是一个组件,其中包含指向包含它的实体的指针。在 Lua 中,我希望能够输入:

print(transform.position.x)
transform.position.x = 10

我已经为位置编写了一个 getter 和 setter,我希望它们包含在 transform.position 下,最好根本不是 getter 和 setter,而是更像公共成员。我当前的 getter 和 setter 如下所示:

int getXPosition(lua_State* L) {
    lua_pushnumber(L, Script::currentEntity->get<Transform>().position.x);

    return 1;
}

那么,如果可能的话,如何做到这一点?

【问题讨论】:

标签: c++ lua


【解决方案1】:

简短回答:可以使用userdatametatables 完成。

更多细节:

  1. 注册将成为position 对象的“类”的元表并为其注册"__index""__newindex" 元方法:

     luaL_newmetatable(L, "position_metatable");
     lua_pushcfunction(L, &position__index);
     lua_setfield(L, -2, "__index");
     lua_pushcfunction(L, &position__newindex);
     lua_setfield(L, -2, "__newindex");
     lua_pop(L, 1);
    
  2. 写函数position__index(它是getter)。这是常规的 C Api 函数,它有 2 个参数:position 用户数据和字段名称。如果字段名称为"x",则函数应返回x 字段的值。

  3. 写函数position__newindex(它是setter)。这是常规的 C Api 函数,它需要 3 个参数:position 用户数据、字段名称和要写入的值。如果字段为"x",则函数应将值写入x 字段。

  4. 要将position 对象从本机代码传递到脚本,请创建用户数据并将"position_metatable" 设置为用户数据的元表,例如28.2 – Metatables

  5. transform.position.x 访问该字段。

【讨论】:

  • position 对象(实例)”是什么意思?这是我的 Vec2 课程吗?我需要把它暴露给 Lua 吗?
  • 通过对象实例,我的意思是创建用户数据并分配position_metatable 作为元表。实现该用户数据的一种方法是将指向 Script::currentEntity 或 Script::currentEntity->get().position 的指针存储在用户数据记录中。
  • transform.position:x 不是语法错误,它在 lua 中被称为 冒号运算符,它是将 self 隐式传递给对象的语法糖,参见 lua.org/pil/16.html
  • 此语法仅适用于方法,不适用于字段。
猜你喜欢
  • 2015-07-20
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
相关资源
最近更新 更多