1

そのため、すでにインスタンス化されているC++オブジェクトをスクリプト言語で変更できるようにしたいと思います。LuaBindを使用したLuaとSWIGまたはBoost::Pythonを使用したPythonを見てきましたが、オブジェクトの新しいインスタンスを作成する方法しかわかりませんが、既存のインスタンスを変更したいと思います。例:

C ++:

Player playerOne = new Player();

スクリプト言語:

playerOne.Transform.x += 5;

これは可能ですか?もしそうなら、これを達成するための優れた言語/ライブラリとしてワットを提案しますか?

4

4 に答える 4

1

私のメインプロジェクトではLuaBindを使用していますが、これは非常にうまく機能します。私たちは基本的にあなたが求めていることをします。さまざまな方法で動作を拡張したい既存のC++オブジェクトがありますが、オブジェクト自体のC ++コードで動作を変更するのは、多くの作業とリスクが伴います。

したがって、この例では、少なくとも2つのC ++ラッパークラスが必要です。1つは、プレーヤーを返すAPI関数を記述できる「ゲーム」を表し、もう1つは、戻ることができるC++プレーヤークラスをラップするラッパークラスです。ルア。各ラッパー関数には、luaが呼び出して値を渡すことができる、内部でラップされた個々のオブジェクトをいじるapi関数/プロパティがあります。これは、LuaBindの使用例とその外観を示す記事へのリンクです。

http://blog.nuclex-games.com/tutorials/cxx/luabind-introduction/

于 2012-04-06T15:58:41.010 に答える
1

私は最近、同じことをする必要がありました。Boost.Python も検討 (および使用) しましたが、個人的には (Boost が大好きなのと同じくらい)、1 つの機能を取得するために Boost ライブラリの半分をドラッグするのは少しやり過ぎだと感じました。

興味がある方のために、私は最近 ECS:Python と呼ばれる非常に軽量な Python ラッパー ライブラリを実装しました。ECS:Python (Embedded C++ Scripting with Python) は、C++ アプリケーションから組み込み Python インタープリターにオブジェクトを公開してインタラクティブなスクリプトを作成したい C++ 開発者向けに特別に設計されています。

その無料 (BSD) とオープン ソース: http://sourceforge.net/projects/ecspython

于 2012-11-28T05:01:23.907 に答える
0

ホスト言語からスクリプト言語に値をマジックできるメカニズムはありません。特定のオブジェクトインスタンスにスクリプト言語でアクセスできるようにする場合は、何らかの関数を介してスクリプト言語に指定する必要があります。

これは、適切にカプセル化された他のC++タイプと同じです。オブジェクトAがインスタンスTを作成して保存する場合、オブジェクトBがそれを取得できる唯一の方法は、Tを返すA上の関数を呼び出す場合です。

于 2012-04-05T18:33:31.843 に答える
0

私は自分のプロジェクトで問題を抱えていました。Ogre3d フォーラムの私の投稿をご覧ください: http://www.ogre3d.org/forums/viewtopic.php?f=5&t=41631&p=332200&hilit=mrmclovin#p405204

コード例:

int main (int argc, char * const argv[])
{
  try
  {
    // Initialize the python interpreter
    Py_Initialize();

    // Create a module dynamically
    object module((handle<>(borrowed(PyImport_AddModule("NameOfMyModule")))));

    // Retrieve the module's namespace
    object main_namespace(module.attr("__dict__"));

    // Put a c++ class named "Car" exported using boost.python into our module
    main_namespace["Car"] = class_<Car>("Car")
                                               .def("drive", &Car::drive)......;

   // The class car now exists in a dynamic module
   // and that module is accessable everywhere as longs as the python interpreter exists

   // Create a instance of Car here
   Car* myCar = new Car(...);

   // Now simply add it to the module. Make sure you have exposed class Car before adding instances
   main_namespace["car_instance"] = object(ptr(myCar)); // the boost python ptr() class make sure not to copy the pointee but only copy pointer adress
  }
  catch( error_already_set )
  {
    PyErr_Print();
  }

  return 0;
}
于 2012-12-07T12:44:19.067 に答える