2

大多数绑定库/包都非常清楚如何公开类 TYPE 以便可以在 Lua 脚本上创建它。

我真正遇到的困难是如何给 Lua 脚本一个已经创建/实例化/分配的类对象,以便您可以从 Lua 脚本调用其公开/绑定的方法(也在 c++ 端更新对象) ..

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

我使用Lunar将我的 AIAgent 类方法公开给 Lua。它的工作,我可以在 Lua 脚本上创建AIAgents..但是谁在乎,我不是在 Lua 上编程,我使用 Lua 编写我的 AI 代理脚本,我的游戏引擎的一部分,由我的游戏引擎创建,更新/碰撞检测和响应/drawing 全部由 c++ 代码完成,脚本唯一要做的就是为代理提供决策代码(代理更新方法上调用的 lua 协程)。这个决定使脚本可以访问一些注册的(通过 Lunar)方法(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++ 端已经拥有的对象。

4

1 回答 1

2

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)
于 2012-11-11T20:41:20.400 回答