问题标签 [luabind]
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.
c++ - Lua/C++/luabind/与其他lua行为脚本交互的成员函数延迟执行
我有一个带有主循环的游戏 - 在每个循环上,我都调用游戏中的每个 NPC ->ProcessAI() 来执行任何动作。这是一个服务器,因此不会像客户端游戏那样在每一帧上都执行对 ProcessAI 的调用!它也是单线程的。
现在我想使用 luabind 用 lua 扩展 C++ 代码库(也许,即使有提升开销)。所以我将我的 NPC 类的一些功能暴露给 LUA。
例如,我想创建演员脚本 - 具有更复杂行为的老板战斗 - 每当在我的 c++ ProcessAI 函数中发生事件时 - 我会将其委托给特定 NPC 的相应 lua 脚本。
我想象在我的 boss.lua 脚本中我会有这样的东西
但是-我不知道该怎么做-我认为 ScheduleEvent 应该是导出到 Lua 的一些 C++ 函数-但是保持 NPC(老板)的对象引用并在该脚本中调用函数的最佳方法是什么大约 2 秒后?
此外,随着这种延迟执行——我希望 NPC 可以相互交互——我目前的想法是为每个特殊的 NPC 设置一个演员行为脚本。
现在我想象的是在两个 NPC 之间发起对话,例如
基本上 - 我如何从 lua scriptA 中调用一个函数,该函数存在于 lua scriptB 中,它是 NPC2 的行为脚本。什么是好的设计?
谢谢
c++ - luabind 获取 c++ 对象的类元表以将 obj 作为参数推送给 lua 函数
我注意到性能受到严重影响,将我的一个 c++ 对象作为 lua 函数 arg 引入,例如
这非常快 - 100k 次调用不到 30 毫秒
现在,我添加了另一个对象
10 万次通话现在需要超过 1 秒。(添加另一个原语,如 int 或 string 作为 arg 不会影响性能!另外,将对象放入全局范围(例如,不要每次都将它作为 func arg 推送,也没有性能影响 - 但我需要它作为参数)
这就是我使用 luabind 调用它的方式
通过简单地直接使用 luas pcall 函数,我能够将时间减少 0.5 秒 - 使用这个“hack”:
尽管如此,我认为它可以更快更好 - 这就是我想做的
所以,我相信 luabind 为每个类管理一些元表——但我不知道如何检索它——我在源代码中看到了一些关于“__luabind_classrep”的东西——另外——在全局中有一个用户数据 obj,其名称是我注册的类罗宾德。
编辑:我实际上追踪了最初的减速问题 - 它既不是 luabind 也不是我的代码 - 我正在使用 VS2010 F5 进行基准测试,它会自动附加调试器 - 出于某种原因,当将 MyCObj 作为 arg 添加到 lua 函数时 -调试器减慢了整个处理速度 - 我从 shell 手动运行我的命令行程序,它再次在可接受的范围内(我只是偶然认识到这一点,因为具有相同 VS 项目的更快的计算机需要 4 秒而不是 1 秒不太可能)
lua - 使用luabind调用继承自基类的C++成员函数
这里是 C++ 代码,一个控制台项目
lua 代码在这里使用 luabind
问:
当我在 Button:Create 中调用继承的函数 self:AddAnimation() 时。哇哇!“CControl::AddAnimation”没有打印出来!这是怎么回事?我已经检查了 2 个小时。令人沮丧!任何帮助将不胜感激
c++ - 从 C++ 基类创建 lua 对象
我已经从 C++ 导出到 lua 这样的基类:
导出代码:
下一部分:我有具有功能的 StateManager:void StateManager::Push(IState*)
它是导出:
现在,我想在 Lua 中创建 IState 类型的对象并将其推送到 StateManager 中:
当然,这是行不通的。如果 IState 类型的对象,我不知道该怎么说 MainState:
UPD
示例后:
错误:“IState”类中没有静态“__init”
并且应该state = StateManager
有括号?对于他们来说,没有这样的运营商是错误的。
lua - 回调 Lua 成员函数
我有一个 lua“动画变量”,它有一个在动画循环中使用的回调函数。
跳过细节,这个 addCallback 函数在 C++ 中定义如下:
并且当动画变量被更新时,回调就这样执行(我们用一个参数调用函数):
我的问题如下:如何将成员函数与 addCallback 一起使用?假设我有一个Ticker:animate(ypos)
函数,在 Ticker 实例上使用 addCallbackaddCallBack(ticker:animate)
不会编译,addCallBack(ticker.animate)
也不起作用。我知道lua中的成员函数有一个隐含的“self”第一个参数。
任何解决方案还是我被迫使用全局函数?
c++ - 使用 lua 和 luabind 链接错误 - mingw
我正在使用luabind将我的 C++ 类绑定到 lua,我可以让 luabind 和大多数 lua 函数工作,但如果我尝试使用,luaL_openlibs()
我会得到:
如果我将 -llua 添加到链接器中,我会得到:
我自己构建了 luabind,因为我找不到预构建的 mingw 二进制文件。
lua - Luabind - 无法找到 Lua 库
我正在尝试为我的项目编译 Luabind,但收效甚微。我将 lua 目录(包含 src、makefile 等)作为 luabind 的兄弟。我将 LUA_PATH 设置为 /my/dirs/lua 文件夹。我正在运行 OSX 服务器 10.4。
当我进入 luabind 并输入 bjam 时,出现错误:
如果我将 LUA_PATH 设置为不正确的目录,则错误位于第 73 行(无法确定 Lua 包含目录)。
我已经松散地遵循了本教程:http ://cfc.kizzx2.com/index.php/building-luabind-on-mac-os-x/
c++ - luabind 没有对指针 mingw 进行更改
我已经修复了我在这个问题中遇到的链接器错误,但现在我遇到了另一个问题。我通过调用createObject()
lua 来创建我的对象,并为一个新对象创建一个 boost::shared_ptr,将它添加到一个列表中,然后返回它。
在带有 mingw 的 Windows 上,当我在 lua 中进行更改时,这些更改不会应用于 C++ 对象。我的代码不会有问题,因为我在 Linux 上构建了相同的东西并且它运行良好。
ObjectPtr
和PlayerPtr
是 Object 和 Player 的 boost::shared_ptr,window
是一个静态的 Window 指针,和createPlayer()
不createObject()
带任何参数使用Player
代替Object
.
在 lua 中:
导致“红色”被放入控制台。但在 C++ 中,该值只是“”。
我对其进行了调试,并且确实在 C++ 中创建了对象并将其添加到列表中,但是没有进行任何更改,因为所有变量都处于默认状态。
我认为这是 luabind 和 mingw 的问题,或者只是构建有问题,
我从默认构建设置中改变的唯一事情是我需要做两件事才能让它编译:我在 jamfile 中设置 LUA_PATH 指向 lua 所在的目录(而不是从环境变量中获取它)和我变了
至
因为mingw出于某种原因不喜欢(
...(是的,我确实在正确的位置添加了#endif)
更新:我也尝试过使用 msvc10,但仍然存在同样的问题。我还尝试针对我的 Linux 上相同版本的 boost 构建它。但无济于事。
c++ - 使用 C++ 中的 Luabind 循环创建的对象导致应用程序崩溃
我正在尝试将 Lua 与我的游戏引擎原型一起使用,但我遇到了奇怪的错误。
我的目标是用 Lua 循环创建 X 对象并渲染它们。
如果我这样做,代码可以正常工作,但游戏会在瞬间到几秒的随机时间内崩溃。如果我将此代码仅用于循环创建的对象,而不是手动创建的对象,游戏会立即崩溃。
但是,如果我用 C++ 编写等效的 Lua 代码,它可以毫无问题地运行。
这是我的 Lua 绑定
除 AddChild 外,每个方法都接受并返回 void
Sprite 和 Box a 和 Circle 对象都继承自 Node 类。
有谁知道什么会导致这个奇怪的错误?我会很高兴有任何帮助。
c++ - C++模板方法创建对象
我正在使用 Luabind 将我的游戏引擎暴露给 Lua。我最近遇到了麻烦,因为我发现无法在 Lua 中创建“新”,例如 GUIObject * obj = new GUIObject(),而是在 Lua 中创建的所有内容都归 Lua 所有。
好吧,这不是一个大问题,我决定在对象上创建一种工厂模式,例如我的 GUIManager 有
我的 Luabind 绑定看起来像这样:
通过调用在 Lua 中找到一切工作:
但是我觉得这不是“正确的”,因为我实际上是在创建一个要传入的对象,我确信有一种更简单的方法,但到目前为止我尝试过的所有其他方法都不同意编译器或卢宾德。
如果需要,请随时询问更多信息
谢谢