问题标签 [luabridge]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
54 浏览

c++ - LuaBridge 无法描述的错误

我使用 LuaJit 和 LuaBridge 编译 lua 代码并执行它。当 lua 代码抛出错误时,真的很难调试——我不知道它发生在哪一行或者是什么原因造成的。

这是一个例子: [string "1"]:0: bad argument #1 to 'info' (string expected, got table) 在代码中:

如何翻译[string "1"]成匹配的代码行?我可以获得堆栈跟踪吗?

lua 代码是string.dump在文本代码上“编译”的,然后用luaL_loadbuffer. 加载和调用 lua 函数的伪代码:

0 投票
2 回答
360 浏览

c++ - 从 Lua 修改 main() 中的 C++ 数组,无需额外分配

我正在绘制一个小型 C++ 程序,它将数组传递给 Lua 并在那里修改它们,我打算在程序中读取一个 lua 脚本,这样我就可以修改它而无需重新编译程序

我的第一个障碍是确保 Lua 能够修改已经分配的数组,而不是让它们在 Lua 空间中再次分配。数据将是浮动的,大小会非常大,但我现在开始很小。

为了简化这个界面,我尝试了 LuaBridge 2.6,但它没有提供预期的结果。下面是一个完全“工作”的程序。

请注意,没有任何匹配项。Lua 中的 output[10] 不是 C++ 空间中 input[256] 的值,而是 input[0]。C++ 输出数组没有从 Lua 内部更新,cout 显示它保持我们初始化的状态 (0)。为了确认这一点,我们将 output[10] 的这个值推送到堆栈中,它不是 C++ 中的 input[256],而是从 C++ 中检索的。你们能纠正我或指出我应该在哪里实现这一目标吗?

======= 2020 年 8 月 11 日更新 =======

为了澄清程序正在做什么(或应该做什么),在阅读了 Robert 和 Joseph 的考虑之后,我在下面发布了 C++ 部分和它调用的 lua 脚本的更新版本。请注意,我放弃了 LuaBridge,因为我在第一次尝试中没有成功:

C++:

Lua 脚本如下所示:

0 投票
2 回答
122 浏览

c++ - 使用 LuaBridge 导出容器类

我想将 SRect 和 SRectVector 从 C++ 导出到 Lua,但编译失败。正确的方法是什么?编译器:vs2019,vc++11 操作系统:Win10 64

Push() 遇到编译错误,

我认为参数只是 SRectVector *,为什么编译器认为它是 'std::vector<SRect,std::allocator<_Ty>>'?

0 投票
1 回答
72 浏览

c++ - C++ 调用 Lua 函数

我即将在我的项目中包含 Lua。只有一个问题,如果我链接我自己的类并在 Lua 中创建它,堆栈没有清理,我得到内存泄漏。内存不断上升。

我的课:

C++ 测试代码:

Lua 代码

我正在使用 Lua 5.2.0。

0 投票
1 回答
110 浏览

c++ - 使用 LuaBridge 从 LuaRef 读取参数列表

[解决]

我正在构建一个使用 LuaBridge 来读取实体组件的游戏引擎。在我的引擎中,一个实体文件如下所示,其中“组件”是我的实体拥有的组件的列表,其余参数用于设置每个单独组件的值:

我目前正在使用这个函数(在 C++ 中)来从 LuaRef 中的参数(给定它的名称)中读取值。

例如,当调用readVariable<std::string>(myRigidbodyTable, "Type")时,myRigidbodyTable是具有 Rigidbody 值的 LuaRef,此函数应返回值为“Sphere”的std::string 。

我的问题是,当我完成读取和存储 Transform 组件的值时,当我想读取“Ridigbody”的值并且我的引擎读取值“Type”时,Stack::push(lua_State) 会引发未处理的异常* L, const std::string& str, std::error_code&)。

我很确定这与我的组件 Transform 存储“位置”等参数的值列表这一事实有关,因为在读取每个参数只有一个值的组件时我没有遇到任何问题。这样做的正确方法是什么,以防我做错了什么?

我还想指出,我是 LuaBridge 的新手,所以这可能是一个初学者问题,我一直找不到解决方案。任何帮助表示赞赏:)

0 投票
1 回答
68 浏览

lua - 如何使用 luaBridge 将 lua 表传递给 c++ 类构造函数?

这就是我想做的。

诠释卢亚:

在 C++ 中

我很抱歉英语能力差。

我想从 MyObjectClass 的构造函数中接收 lua 表。

0 投票
0 回答
68 浏览

c++ - 如何使用 c++ 全局运算符重载 luabridge 算术运算符?

我正在尝试使用 Luabridge 在 Lua 中实现 Vector3 类。到目前为止,我能够构建它,并像您期望的那样访问每个组件 (x, y, z)。Lua 中的示例如下所示:

现在,我想重载算术运算符,从加法开始。我使用 glm 作为我的主干数学库,所以我只能访问他们定义的全局运算符 +。因此,我能够让它工作的唯一方法是使用 luabridge 的 addStaticFunction,目前我的类注册看起来像这样:

但是,当我尝试使用它时,例如:

我得到以下异常:attempt to perform arithmetic on a userdata value

奇怪的是,如果我直接使用该函数,它就可以工作,例如:

据我了解,在 Vec3 的元表中存在一个名为 __add 的函数,它也应该能够将其用于算术运算符。显然情况并非如此,但我找不到任何资源来解释还需要做什么才能使其正常工作。

我在这里看到过类似的问题:Luabridge binding 重载操作符

但是,在他的示例中,他可以访问非全局运算符,这是我的问题不同的地方。

0 投票
0 回答
23 浏览

c++ - 使用 LuaBridge 的模板函数内部的“addConstructor”出现奇怪的编译器错误

编辑:我将 XCode 12.5.1 与 GCC 一起使用。此问题可能仅限于 GCC,因为 MSC 正在编译它而没有错误。奥格。

我正在尝试设置通用模板函数以向 LuaBridge 添加类。我收到一个奇怪的错误.addConstructor。最终我正在考虑refl-cpp获取类型名称和函数信息,但现在我正在努力解决这个与refl-cpp.

这是我的模板功能:

请注意,.addFunction调用没有问题。如果我注释掉.addConstructor. 奇怪的是,如果我在调用中忽略T模板类和硬编码,它会起作用:foobeginClass

我真的无法判断问题出在addConstructor或中beginClass

编辑:查看下面的链接文章。基于此,简短的回答是将调用更改addConstructor为如下:

这适用于 MSC 和 GCC。

0 投票
1 回答
41 浏览

c++ - 使用 LuaBridge 从 Lua 迭代 C 数组类型的容器类

这可能是一个新手问题,但我无法通过网络搜索找到答案,甚至可以帮助我入门。我有一个容器类,它本质上是一个 C 风格的数组。为简单起见,让我们将其描述为:

LuaBridge我们可以假设我已经成功地将它注册为全局my_array命名空间。我想像这样从 Lua 迭代它:

我猜我可能需要each在全局命名空间中注册一个函数。问题是,我不知道该函数在 C++ 中应该是什么样子。

如果使用了代码,这可能会更容易,std::vector但我正在尝试为现有代码库创建一个 Lua 接口,该代码库很难更改。

0 投票
1 回答
33 浏览

c++ - 从 Lua 脚本反映 LuaBridge 类

__parent在 2019 年 4 月之前,Lua 脚本可以使用字符串键、__class__propget和来反映 LuaBridge 类的方法和属性__propset。这是一个非常有用的工具,用于创建测试脚本和开发工具以维护导出到 Lua 中的大型类框架。

通过查看 LuaBridge 的发行说明,似乎出于安全原因删除了字符串键。但我发现自己更重视从脚本中反映类的能力,而不是脚本是否可以在对象模型中混杂。特别是在开发模式下。

LuaBridge参考手册暗示C/C++ 程序有一种方法可以公开元表,但我无法弄清楚如何去做。我对 C 和 Lua(或 LuaBridge)之间的接口非常陌生,所以我对我感到困惑并不感到惊讶。如果有人可以分享如何执行此操作的示例,我将不胜感激。