如何推送要在Lua脚本上使用的现有/创建/实例化的类对象?

时间:2012-11-11 20:23:06

标签: c++ lua

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

我真的遇到了什么困难,是如何给Lua脚本一个已经创建/实例化/分配的类对象,这样你就可以从Lua脚本中调用它的暴露/绑定方法(也可以在c ++方面.. ..

如果仍然不清楚,我会给出我现在所拥有的真实例子。

我使用Lunar将我的AIAgent类方法暴露给Lua。 它的工作,我可以在Lua脚本上创建 AIAgents ..但是谁在乎,我没有在Lua上编程,我使用Lua编写我的AI代理脚本,这是我游戏的一部分由我的游戏引擎创建的引擎,更新/碰撞检测和响应/绘图都是由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 ++方面已有的对象。

1 个答案:

答案 0 :(得分: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)