おそらく、この例は概念を説明するのに役立ちます。既存の抽象クラスから派生した新しいクラスを定義する必要があります。抽象クラス メソッドの 1 つをコールバック コードでオーバーライドします。次に、派生クラスのオブジェクトを作成し、それをコールバックを呼び出す関数に渡します。これは十分に一般的な C++ 手法です。
struct MyContactResultCallback : public ContactResultCallback
{
btScalar addSingleResult(btManifoldPoint& cp,
const btCollisionObjectWrapper* colObj0Wrap,
int partId0,
int index0,
const btCollisionObjectWrapper* colObj1Wrap,
int partId1,
in index1)
{
// your callback code here
}
};
MyContactResultCallback callback;
world.contactPairTest(bodyA, bodyB, callback);
このライブラリについては何も知らないことを付け加えておきます。ドキュメントを読んだところです。
編集
にコンテキスト メンバーを追加する方法を示しますMyContactResultCallback
。
struct MyContactResultCallback : public ContactResultCallback
{
MyContactResultCallback(some_type* ptr) : context(ptr) {}
btScalar addSingleResult(btManifoldPoint& cp,
const btCollisionObjectWrapper* colObj0Wrap,
int partId0,
int index0,
const btCollisionObjectWrapper* colObj1Wrap,
int partId1,
in index1)
{
context->currentPoints += 10;
}
some_type* context;
};
MyContactResultCallback callback(ptr_to_some_object);
world.contactPairTest(bodyA, bodyB, callback);
ptr_to_some_object
currentPoints
インクリメントするオブジェクトへのポインタです。私はそれがどのタイプのオブジェクトなのかわかりませんsome_type
。
これが、関数の代わりにオブジェクトをコールバックとして使用するポイントです。コールバックが目的に応じてデータ メンバーを追加できるオブジェクトである場合、関数に対してそれを行うことはできません。