我目前正在开发一个2D游戏引擎,在实现LUA脚本/解释器时遇到了困难。
我正在使用SWIG,并且已经获得了所有的基本功能,运行良好。
在引擎中,我使用GLM (OpenGL、数学库、http://glm.g-truc.net/)来处理所有与向量和矩阵相关的区域。
我真的需要将glm (在基本级别上)公开给via SWIG to LUA,这样我就可以在LUA中调用如下方法:
actor:GetPosition() <- Which returns a glm::vec2GLM是一个相当复杂的库(可能是轻描淡写的笑),我不需要整个事情公开,这将是荒谬的工作量。我只是希望能够访问glm::vec2类的xy组件。
我相信这一定很简单,因为SWIG不需要完整的类定义,而且肯定有一种方法可以让SWIG假设glm::vec2类只有x,y参数。
我不确定在SWIG中使用代理类是否是这样做的方法?或者其他方法?我对LUA集成和SWIG也很陌生。
我真的不想走的一条路是抛弃GLM,编写我自己的Vector/Matrix库,它更简单,没有模板等,然后我可以简单地用SWIG包装,但我觉得这是浪费时间,我最终会得到一个功能不那么强大的数学库:(.
提前感谢,如果需要的话,我可以提供更多的信息。
发布于 2012-08-14 21:11:35
luabind中的解决方案将如下所示:
#include <luabind/luabind.hpp>
extern "C" int init(lua_State* L)
{
using namespace luabind;
using namespace glm;
open(L);
module(L)
[
class_<dvec2>("dvec2")
.def_readwrite("x", &dvec2::x)
.def_readwrite("y", &dvec2::y)
];
return 0;
}发布于 2012-08-14 21:15:57
GLM的一个大问题是它的向量类型使用的东西具有可疑的C++有效性。许多编译器会允许,但标准不允许的事情。SWIG使用自己的解析器来工作,因此它将很难理解GLM的定义。
在这种情况下,我建议使用像Luabind这样的东西,而不是SWIG。在这种情况下,它提供了更细粒度的控制,并且它的好处是不使用自己的解析器。当然,您可以在.swig文件中有效地重写GLM的重要部分的原型。
https://stackoverflow.com/questions/11949886
复制相似问题