2012-03-07 7 views
2

クラスオブジェクトを登録し、そのクラスの特定のインスタンスをスクリプトに渡す適切な方法について、AngelScriptマニュアルに続く問題があります。私がAngelScriptに気づかせたいと思っているC++クラスCircleがあるとします。AngelScriptでC++クラスを登録してクラスインスタンスを渡します

class Circle 
{ 
public: 
    int getArea(); 

    int radius; 
}; 

ここから、IはAngelScriptエンジンにgetArea()メソッドを登録(またはそれが可能であれば自動的にクラスのメソッドのすべてのレジスタ)、及び通過、Circleクラスのインスタンスを作成したいですクラスインスタンス自体をAngelScript環境に追加します。

Circle circleInstance; 
circleInstance.radius = 10; 

// Initialize AngelScript engine 

asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); 

engine->RegisterObjectMethod("Circle", "int getArea()", 
    asMETHOD(Circle, getArea), asCALL_THISCALL); 

AngelScriptでは、インスタンス変数からメソッドを呼び出し、C++関数の結果を返すことができます。

circleInstance.getArea(); 

しかし、上記のコードでは、私は明らかにどのような方法でAngelScriptエンジンにインスタンスcircleInstanceを渡しておりませんので、スクリプティング環境は、その存在のないアイデアを持っていません。私は何かを見落としていると仮定し、その答えはC++のほんの1〜2行だけであると仮定します。 CircleクラスをRegisterObjectTypeまたはRegisterInterfaceのようなメソッドで登録する必要があります。Circleがこれを機能させるにはasIScriptObjectを継承する必要がありますか?どんな洞察にも感謝しています!

+0

これは、[手動で]カバーされていない(http://www.angelcode.com/angelscript/sdk/docs/manual/doc_register_type.html)詳細? –

+0

これは見た目ですが、「オブジェクト型の登録」のどこにも、テキストの一部を見落とさない限り、クラスのインスタンスを渡す方法はありません。'Circle'のようなクラス名をクラス型として渡す方法について説明していますが、' circleInstance'のようなクラスインスタンスを環境に気づかせる方法は不思議です。 – Vortico

+0

しかし、今私は何かをしています。スクリプト環境で 'circleInstance'をグローバルとして登録したいのであれば、' engine-> RegisterGlobalProperty( "Circle @circleInstance"、&circleInstance); 'もしそうなら、それは私の問題の半分を解決するでしょう。 AngelScriptにクラスに関する情報を与えるには、 'RegisterObjectType'または' RegisterInterface'を使うべきですか?クラスの各メソッドを登録する必要がありますか、それとも自動的にこれを行いますか? (そうでない場合、私はこの印象をどこで得たのか分かりません) – Vortico

答えて

7

まず、Circleオブジェクトを登録します。

engine->RegisterObjectType("Circle",0, asOBJ_REF); // asOBJ_REF because you wanted a reference call 
engine->RegisterObjectBehaviour("Circle", asBEHAVE_ADDREF, "void f()", asMETHOD(Circle, AddRef), asCALL_THISCALL); 
engine->RegisterObjectBehaviour("Circle", asBEHAVE_RELEASE, "void f()", asMETHOD(Circle, ReleaseRef), asCALL_THISCALL); 

メモAddRefおよびReleaseRef関数に注意してください。これらは、Angelscriptが必要に応じてメモリから解放できるようにするための必須の機能です。実際にそれらを実装する必要はありませんが、あなたの例では参照のみを使用したいのです。このように宣言するだけです

class Circle 
{ 
public: 

    void AddRef() { /* do nothing */ } 
    void ReleaseRef() { /* do nothing */ } 
} 

今登録方法です。 (getArea()関数)

engine->RegisterObjectMethod("Circle", "int getArea()", asMETHOD(Circle, getArea), asCALL_THISCALL); // asCALL_THISCALL means we will call function using myCircle.getArea() 

次にグローバルプロパティを登録してください。これは、あなたがangelscriptで使用したいインスタンスです。

engine->RegisterGlobalProperty("Circle myCircle", &CircleInstance); 

は今、あなたのangelscriptファイル

int value = myCircle.getArea(); // remember you registered myCircle as Circle reference 

int radius = myCircle.radius; // error. you need to register each member. 

に私はあなたが最後までドキュメントの開始を読むことをお勧めします。オブジェクトハンドル、参照カウントなどは、把握する必要がある非常に重要な概念です。

angelscriptは非常に簡単に埋め込むことができますが、ドキュメントが多く役立ちます。しかし確かにあなたの手を保持していません。

これはGoogleで見つけたので、これは遅れての回答です。私はその質問が未回答のままになることを望んでいませんでした。私の答えが役に立つと思う人もいます。

img

関連する問題