2

ほとんどのバインド ライブラリ/パッケージでは、クラス TYPE を公開して Lua スクリプトで作成できるようにする方法が明確になっています。

私が本当に苦労しているのは、すでに作成/インスタンス化/割り当てられたクラスオブジェクトをLuaスクリプトに与える方法です。これにより、Luaスクリプトから公開/バインドされたメソッドを呼び出すことができます(オブジェクトを更新しますC ++側でも) ..

これでもはっきりしない場合は、私が今持っている実際の例を挙げます。

Lunarを使用して、AIAgent クラス メソッドを Lua に公開しています。Lua スクリプトでAIAgentsを作成できます。しかし、Lua でプログラミングするのではなく、Lua を使用して AI エージェントをスクリプト化し、ゲーム エンジンの一部であり、ゲーム エンジンによって作成され、更新/衝突検出と応答を行うことができます。 /drawing はすべて c++ コードによって行われます。スクリプトが行うことになっている唯一のことは、エージェントに意思決定コード (エージェント update メソッドで呼び出される 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 ++側に既にあるオブジェクトをスクリプトに与える方法がわかりません。

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

ルアで:

local a=A()
a:print(42)
local b=GiveMeA() --created on the C++ side
b:print(42)
于 2012-11-11T20:41:20.400 に答える