0

ここに私のC++のメイン関数があります:

int main() {
lua_State* L = luaL_newstate();
luaL_openlibs(L);
getGlobalNamespace(L).
        beginNamespace("o").
            beginClass<Object>("Object").
                addConstructor<void (*) (double, double)>().
                addProperty("width", &Object::getWidth, &Object::setWidth).
                addProperty("height", &Object::getHeight, &Object::setHeight).
                addProperty("x", &Object::getX, &Object::setX).
                addProperty("y", &Object::getY, &Object::setY).
            endClass().
        endNamespace();
lua_pcall(L, 0, 0, 0);
luaL_dofile(L, "main.lua");}

そして、これがLove2Dの私のmain.luaです

function love.load()
   obj = o.Object(10, 20) end

愛を込めて実行しようとすると、obj は nil 値であると表示され、Love2D がオブジェクト クラスを作成するために C++ でメイン関数を実行していないことに気付きました。LuaBridge を使用して Lua で C++ メイン関数を呼び出すにはどうすればよいですか?

4

1 に答える 1

0

あなたがやっていることは、2 つの別々のプログラムを使用することです: 「メイン関数」でビルドしたものと、実際の Love2D 実行可能ファイルです。それらは別個の実行可能ファイルです。それらは、必要以上に相互に関係を持っていませlua.exepython.exe

あなたがやりたいと思っていることは、 Love2Dで使用されるC++ ライブラリを作成することです。それは可能ですが、C++ プログラムではなく動的ライブラリを作成する必要があります。Lua C モジュールを作成する必要があります。

動的ライブラリの作成方法は、選択したプラットフォームによって異なります。ただし、Lua 5.1 のドキュメントで詳しく説明されているように、その動的ライブラリは適切な関数をエクスポートする必要があります。C モジュールの名前が「test」の場合は、 という関数をエクスポートする必要がありますluaopen_test

この関数の仕事は、本質的にあなたmainがすることです。関数で Lua 状態を作成する必要はありませluaopen_ん。それは1つ与えられます。その仕事は、モジュールでエクスポートしたい関数と API を含むテーブルを返すことです。そのため、必要に応じてすべてを Lua に登録します。

あなたmainはそのものをグローバルな「名前空間」に入れますが、これは一般的に非常に失礼だと考えられています。ローカル テーブルを作成してそこにデータを配置し、そのテーブルを戻り値として返すことをお勧めします。私は LuaBridge の API に詳しくないので、それを行う方法がわかりません。

最悪の場合、現在行っているようにグローバル テーブルを作成できますが、作成後にローカル テーブルにロードし、グローバル エントリをクリアしてから、テーブルを返します。

于 2016-05-22T14:55:29.213 に答える