C++ 如何将现有/创建/实例化的类对象推送到Lua脚本上使用?

C++ 如何将现有/创建/实例化的类对象推送到Lua脚本上使用?,c++,lua,C++,Lua,大多数绑定lib/包都非常清楚如何公开类类型,以便在Lua脚本上创建它 我真正遇到的困难,是如何给一个已经创建的/实例化/分配的类对象的Lua脚本,这样您就可以从Lua脚本调用它的暴露/绑定方法(也在C++侧更新对象)… 如果这还不清楚,我将给出一个真实的例子,这就是我现在所拥有的 我用它向Lua公开我的AIAgent类方法其工作,我可以在Lua脚本上创建< AiAtAgent…但是谁在乎,我不是在Lua上编程,我使用Lua来编写我的AI代理,我的游戏引擎的一部分,由我的游戏引擎创建,更新/碰

大多数绑定lib/包都非常清楚如何公开类类型,以便在Lua脚本上创建它

我真正遇到的困难,是如何给一个已经创建的/实例化/分配的类对象的Lua脚本,这样您就可以从Lua脚本调用它的暴露/绑定方法(也在C++侧更新对象)… 如果这还不清楚,我将给出一个真实的例子,这就是我现在所拥有的

我用它向Lua公开我的AIAgent类方法<强>其工作,我可以在Lua脚本上创建< <强> AiAtAgent…但是谁在乎,我不是在Lua上编程,我使用Lua来编写我的AI代理,我的游戏引擎的一部分,由我的游戏引擎创建,更新/碰撞检测和响应/绘图都是由C++代码完成的,脚本要做的唯一一件事就是为代理提供决策代码(在代理更新方法上调用的lua协程)。此决策脚本可以访问一些已注册(通过月球)方法(GetHP、GetNAmmunition、GetPlayerPos等)

那么,我如何才能将我的对象赋予脚本?。类似于:

//-fake code- called on the AIAgent constructor, or something
lua_pushObject( luaState, this );
lua_setGlobal( "aiAgentFromC++", -1 ); // object exposed trough "aiAgentFromC++" global var

注意,方法已经公开了,因为我可以在脚本上创建新对象,我不知道如何给脚本一个我已经在C++端上的对象。它也是轻量级和无依赖性的。你是说:

我真正有困难的是,如何给一个Lua脚本 已创建/实例化/分配的类对象

正是这样

样本: C++


您是否考虑过切换到有网站的Lua绑定系统?还是手册?或者在一些解释糟糕的示例代码之外的某种实际文档?我在网上找不到任何关于“月球”的东西。SWIG、Lua++、LuaBind等等,这些都是真实的文档。Lunar不是。LuaBind很慢,我在StackOverflow上尊敬的一个家伙说;SWIG看起来难以置信的复杂,我在寻找轻量级软件包,如果你能推荐我一个,我会非常高兴的..我认为Lunar很好,因为我让它工作得很快,直到我撞到墙..你实例化一个对象并给lua的代码中到底有什么?local a=a()是一个新对象。这正是我在第一段中所说的,而不是我想要的……你将如何识别你的对象?您可以绑定一个接口并提供一个工厂函数,它将给出您在C++端创建的实例。但是你必须知道你想要什么东西。示例待定…我在第一篇文章中给出了我的全部情况,即由引擎创建的aiagent,然后我给出了一个示例(-假代码-),说明我如何通过lua_setGlobal(“aiAgentFromC++,,-1);,给出这个指针,我怎样才能更清楚呢?查看更新的代码。你可以管理你喜欢的C++。只要提供一个方法来识别它们,如果你需要很多的话,比如使用字符串,或者别的什么。好了,你去=D,现在就是它了,我要试试LuaBridge!我在做标记作为答案,即使我还没试过,我也不认为会有任何错误1.我希望如此
class A {
public:
    void print(int x) {
        std::cout<<x<<std::endl;
    }
};

RefCountedPtr<A> GiveMeA()
{
    static RefCountedPtr<A> a(new A);
    return a;
}

int main() 
{
    lua_State *L = lua_open();
    luaL_openlibs(L);
    int s = luaL_loadfile(L, "test.lua");

    luabridge::getGlobalNamespace(L)
        .beginClass<A>("A")
        .addConstructor<void (*)()>()
        .addFunction("print",&A::print)
        .endClass()
        .addFunction("GiveMeA",&GiveMeA);

    if ( s==0 ) {
        s = lua_pcall(L, 0, LUA_MULTRET, 0);
    }
    report_errors(L, s);
    lua_close(L);
}
local a=A()
a:print(42)
local b=GiveMeA() --created on the C++ side
b:print(42)