LuaBridge在Lua中为Love2D运行C ++主要功能

时间:2016-05-22 13:12:59

标签: c++ lua luabridge

这是我的C ++主要功能:

int main() {
lua_State* L = luaL_newstate();
luaL_openlibs(L);
getGlobalNamespace(L).
        beginNamespace("o").
            beginClass<Object>("Object").
                addConstructor<void (*) (double, double)>().
                addProperty("width", &Object::getWidth, &Object::setWidth).
                addProperty("height", &Object::getHeight, &Object::setHeight).
                addProperty("x", &Object::getX, &Object::setX).
                addProperty("y", &Object::getY, &Object::setY).
            endClass().
        endNamespace();
lua_pcall(L, 0, 0, 0);
luaL_dofile(L, "main.lua");}

这是我对Love2D的主要说法

function love.load()
   obj = o.Object(10, 20) end

当我试着用爱来运行时,它说obj是一个零值,我意识到Love2D没有在C ++中运行我的主函数来创建对象类。 如何使用LuaBridge在Lua中调用C ++主函数?

1 个答案:

答案 0 :(得分:0)

您正在做的是使用两个单独的程序:使用“main函数”构建的程序,以及实际的Love2D可执行文件。它们是单独的可执行文件;他们彼此之间的关系不再是lua.exe必须python.exe

您希望想要做的事情是编写 Love2D使用的的C ++库。你可以这样做,但它需要你编写,而不是C ++程序,而是动态库。你必须写一个Lua C模块。

如何编写动态库取决于您选择的平台。但是,动态库必须导出适当的函数,详见the Lua 5.1 documentation。如果您的C模块名为“test”,那么它必须导出一个名为luaopen_test的函数。

此功能的工作基本上是您main所做的工作。您的luaopen_函数不必创建Lua状态;它会给一个。它的工作是返回一个表,其中包含要在模块中导出的函数和API。所以它根据需要用Lua注册所有内容。

你的main将其内容放在全局“命名空间”中,但这通常被认为是非常粗鲁的。最好是构建一个本地表并将你的东西放在那里,将表作为返回值返回。我不熟悉LuaBridge的API,所以我不知道如何去做。

最糟糕的情况是你可以像现在一样构建一个全局表,但是在构建它之后,将它加载到本地表中,清除全局条目,然后返回表。