如何推动在LUA脚本上使用的现有/创建/实例化类对象



大多数绑定的libs/packages让我们清除如何公开类型,以便可以在lua脚本上创建它。

我真正困难的是如何给出一个已经创建/实例化/分配的类对象的LUA脚本,以便您可以从LUA脚本中调用其expated/bended方法(也更新了对象C 侧)..

如果仍然不清楚,我将举一个真实的例子,这是我现在拥有的。

im使用月球将我的AIAGENT类方法暴露于LUA。它的工作,我可以在lua脚本上创建 aiagents ..但是谁在乎,我不在lua上编程,我使用lua来脚本脚本脚本我的AI代理,我的游戏一部分由我的游戏引擎创建的引擎,更新/碰撞检测和响应/绘图都是由C 代码完成的,脚本应该做的唯一的事情就是给代理商决策代码方法 )。此决策使脚本可以访问一些注册(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 方面提供给脚本。

在我看来,

luabridge是最简单的方式。它也是轻巧且无依赖性的。您是说:

我真正遇到的困难是如何给予lua脚本 已经创建/实例化/分配的类对象

它确实做到了

样本:C

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);
}

在lua中:

local a=A()
a:print(42)
local b=GiveMeA() --created on the C++ side
b:print(42)

最新更新