2012-04-05 15 views
0

したがって、既にインスタンス化されているC++オブジェクトをスクリプト言語で変更できます。私はLuaをLuaやPythonでSWIGやBoost :: Pythonで見てきましたが、私はオブジェクトの新しいインスタンスを作成する方法を知っていますが、既存のインスタンスを変更したいのです。 例:C++既に既存のオブジェクトのインスタンスをスクリプト言語に公開する

C++:

Player playerOne = new Player(); 

スクリプト言語:

playerOne.Transform.x += 5; 

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

答えて

0

magicの値は、ホスト言語のスクリプト言語の値にすることはできません。スクリプト言語で特定のオブジェクトインスタンスにアクセスできるようにするには、スクリプト言語にと指定された関数を使用してを指定する必要があります。

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

+0

私は何かのようgetPlayers(のような関数を呼び出しを行うことができ仮定)。プレイヤーや何かへのポインタのリストを返すものが正しいでしょうか? – user947871

1

私のメインプロジェクトではLuaBindを使用しています。私たちは基本的にあなたがしたいことをしています。私たちは、さまざまな方法で動作を拡張したい既存のC++オブジェクトを持っていますが、オブジェクト自体のC++コードにおける動作の変更を行うことは、多くの作業と危険です。

あなたの例では、少なくとも2つのC++ラッパークラスが必要です - プレイヤーを返すAPI関数を記述できる 'Game'を表すクラスと、プレーヤーを返すC++プレーヤークラスをラップするラッパークラスあなたはルアに戻ることができます。それぞれのラッパー関数は、内部でラップされた個々のオブジェクトを使って、luaが呼び出して値を渡すことができるAPI関数/プロパティを持ちます。私は最近、同じことを行うために必要な

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

0

:ここでのように見えるあなたのLuaBindを使用して、何の非常に簡単な例を与える記事へのリンクがあります。私はBoost.Pythonを考慮(と使用)しましたが、個人的に(私がBoostを愛している限り)Boostライブラリの半分をドラッグして1つの機能を得るのはちょっと残念だと感じました。

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

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

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; 
} 
関連する問題