4

私はLuaにかなり慣れていないので、私が組み立てているゲームエンジンにロジック用のLuaスクリプトを実装しようと取り組んできました。これまでのところ、Luaを起動してエンジンで実行することに問題はなく、CからLua関数を呼び出し、LuaからC関数を呼び出すことができます。

エンジンが現在機能する方法では、各Objectクラスには、エンジンが物理学のために描画または処理するためにすばやく反復できる変数のセットが含まれています。ゲームエンジン自体が変更を確認するには、ゲームオブジェクトはすべてこれらの変数にアクセスして操作する必要がありますが、独自の変数を自由に作成できます。Luaはこれに関して非常に柔軟であるため、問題は発生しません。

とにかく、現在、ゲームエンジン側はCランドにあり、パフォーマンス上の理由から、Cランドにとどまってほしいと思っています。したがって、理想的な世界では、新しいゲームオブジェクトを生成するときに、Luaオブジェクトの基本クラスの一部として、この標準の変数セットへの読み取り/書き込みアクセスをLuaに許可する必要があります。これにより、ゲームロジックは次のようになります。でワイルドに実行します。

これまでのところ、2つの別々のオブジェクトテーブルを配置しています。Luaは、数値インデックス付きのグローバルオブジェクトテーブルに自分自身を追加する新しいゲームオブジェクトを生成し、C++関数を呼び出して新しいGameObjectクラスを作成します。 Luaインデックス(int)をクラスに登録します。これまでのところ、C ++関数はLuaオブジェクトを認識し、dostringを使用してLuaランドで操作を実行したり関数を呼び出したりすることができます。

私が今やらなければならないことは、GameObjectクラスの一部であるC ++変数を取得し、それらをLuaに公開することです。これは、googleが私を失敗させているところです。ここで、タグを使用してプロセスを詳しく説明する非常に優れたメソッドに遭遇しましたが、このメソッドは廃止され、メタテーブルが優先されることを読みました。

これを達成するための理想的な方法は何ですか?libBindまたは同等のメソッドを使用してクラス定義を渡す方法を学ぶのは面倒な価値がありますか、それとも各変数をグローバルluaオブジェクトに(一度、スポーン時に)登録する簡単な方法はありますか?Lua 5.1.4の時点で、これを行うための「現在の」最良の方法は何ですか?

4

1 に答える 1

6

1つのアプローチは使用することです

  • C++変数を指すlightuserdata
  • lightuserdataを使用してC++変数にアクセスするためのC関数
  • lightuserdataをC関数のアップバリューとして保持し、すべての変数に対して1つの関数で十分になるようにします。
  • 関数の引数の数を使用して、変数の取得と設定のどちらかを選択します

例えば:

int game_state_var_accessor (lua_State *L)
{
    int *p = lua_topointer(L, lua_upvalueindex(1));
    if (lua_gettop(L) == 0)
    {   // stack empty, so get
        lua_pushinteger(L, *p);
        return 1;
    }
    else
    {   // arg provided, so set
        *p = lua_tointeger(L,1);
        return 0;
    }
}

新しいゲーム状態を作成するときは、以下を使用して各変数のアクセサーを作成できます。

lua_pushlightuserdata(L, (int *)p); // where p points to your variable
lua_pushcclosure(L, game_state_var_accessor, 1);

これでアクセサーはスタック上にあり、グローバル名またはLuaクラスのメソッドの名前にバインドできます。Luaクラステーブルがインデックスのスタックにある場合、tこれは次のようになります。

lua_setfield(L, t, "name_of_accessor");
于 2010-04-21T03:08:22.677 に答える