我正在尝试将 lua 嵌入到我的游戏引擎中。直到现在一切都很好。我开始注册与游戏引擎交互的函数(例如 move_object(id, x, y)),并且注册工作正常。接下来,我尝试像这样使用它:
handlers={}
handlers["update"] = function(objId)
-- print(objId)
move_object(objId, 0, 0)
end
这给了我一个来自 luabind 的“运行时错误”异常。我到处搜索,根据互联网(和 luabind 源),错误消息应该仍然在 lua 堆栈的顶部。我尝试捕获 luabind::error,并像这样打印堆栈的顶部:
std::cout << "error: lua: " << lua_tostring(exc.state(), -1) << std::endl;
像这样:
std::cout << "error: lua: " << luabind::object(luabind::from_stack(exc.state(), -1)) << std::endl
并且都打印这个:
error: lua: update
我假设这只是我从处理程序表中调用更新函数时推送的最后一个值。这个值应该在遇到错误时被详细的错误字符串覆盖,对吗?根据luabind源文件“error.hpp”的定义class error
:
// this exception usually means that the lua function you called
// from C++ failed with an error code. You will have to
// read the error code from the top of the lua stack
// the reason why this exception class doesn't contain
// the message itself is that std::string's copy constructor
// may throw, if the copy constructor of an exception that is
// being thrown throws another exception, terminate will be called
// and the entire application is killed.
我相信我的 lua 代码的问题实际上在于我的 move_object 函数的注册(更新函数运行。我知道这一点,因为我之前取消了该 print 调用的注释),但如果没有更好的错误信息,我无法确定!哈哈
我修复了错误,如果它有任何帮助。我正在定义 move_object 函数,如下所示:
luabind::module(m_L)[
luabind::def("move_object", &ScriptEntityManager::move_object)
];
但显然,您不能使用 luabind 将静态成员函数定义为常规函数。我把它改成了这个(move_object
在 C++ 中做了一个常规的全局函数):
luabind::module(m_L)[
luabind::def("move_object", move_object)
];
我不知道这是否有助于解决原始问题,但我认为更多信息不会造成伤害!:)