2

私は現在 2D ゲーム エンジンに取り組んでおり、LUA スクリプティング / インタープリターの実装中につまずきました。

私はSWIGを使用しており、基本はすべて正常に機能しています。

エンジンでは、 Vector と Matrix に関連するすべての領域に GLM (OpenGL Mathematics Libary http://glm.g-truc.net/ ) を使用しています。

次のように LUA でメソッドを呼び出すことができるように、GLM を (基本レベルで) SWIG から LUA 経由で公開する必要があります。

actor:GetPosition()  <- Which returns a glm::vec2

GLM は非常に複雑なライブラリ (控えめな表現かもしれません 笑) であり、すべてを公開する必要はありません。glm::vec2 クラスの xy コンポーネントにアクセスできるようにしたいだけです。

SWIG は完全なクラス定義を必要とせず、glm::vec2 クラスには x,y パラメータだけがあると SWIG に仮定させる方法が必要なので、これは簡単に違いないと確信しています。

SWIGでプロキシクラスを使用することがこれを行う方法であるかどうかはわかりませんか? または他の方法ですか?私は LUA 統合と SWIG もまったく初めてです。

私が本当に行きたくないルートの 1 つは、GLM を捨てて、はるかにシンプルな独自の Vector/Matrix ライブラリを作成することです。テンプレートなどはなく、SWIG でラップするだけで済みますが、これは時間の無駄だと感じています。最終的には、あまり強力ではない数学ライブラリになってしまいます:(。

事前に感謝します。必要に応じて、さらに情報を提供できます。

4

2 に答える 2

2

GLMの大きな問題は、そのベクトル型が疑わしいC++の妥当性を持つものを使用することです。多くのコンパイラが許可するものですが、標準では許可されていません。SWIGは独自のパーサーを使用して機能するため、GLMの定義の先頭または末尾を作成するのに苦労するでしょう。

このような場合は、SWIGではなくLuabindのようなものを使用することをお勧めします。このような状況では、もう少しきめ細かい制御が可能であり、独自のパーサーを使用しないという利点があります。確かに、.swigファイル内のGLMの重要な部分のプロトタイプを効果的に書き直すことができます。

于 2012-08-14T13:15:56.630 に答える
1

luabindでのソリューションは次のようになります。

#include <luabind/luabind.hpp>


extern "C" int init(lua_State* L)
{
    using namespace luabind;
    using namespace glm;

    open(L);

    module(L)
    [
        class_<dvec2>("dvec2")
            .def_readwrite("x", &dvec2::x)
            .def_readwrite("y", &dvec2::y)
    ];

    return 0;
}
于 2012-08-14T13:11:35.057 に答える