0

私は C++ を初めて使用するので、用語の使用が間違っていたらすみません。

ofxMSAPhysics という物理ライブラリを利用する openframeworks でアプリを作成しています。この目的のために、MSAPhysics の Particle3D クラスを継承する「particle」というカスタム クラスを作成しました。

ここでは、カスタム オブジェクトへのポインターを物理エンジンに渡します。

particle * p = new particle(ofVec3f(getTokenCoors(index)));
physics.addParticle(p);

私のカスタム クラスには、1 つのパーティクルが別のパーティクルと衝突するときに true に設定する、collide というパブリック メンバーがあります。これを行うには、Particle3D の仮想メソッドの 1 つをオーバーライドします。

void collidedWithParticle(ParticleT *other, ofVec3f collisionForce) {
        collide = true;
    }

ここで、ある粒子が別の粒子と衝突するタイミングを確認したいと思います。physics.getParticle(i)は、物理エンジンからパーティクルを返しますがParticle3D、カスタム パーティクル タイプではなく、 type の 1 つです。したがって、から返されたパーティクルをループするとgetParticle()、「衝突」変数が含まれていません。

エンジンに追加されたカスタム パーティクルにアクセスする方法はありますか?

何か明確にできることがあれば教えてください。

編集: collidedWithParticle() は Particle3D の仮想メンバーです。オーバーライドされたメソッドに衝突をtrueに設定して、それが機能するかどうかを確認しました。

4

2 に答える 2

1

システム内のすべてのパーティクルがオーバーライドされたタイプであることが確実な場合は、を使用してParticle3Dto を単純にキャストできますparticle

particle* myParticle = static_cast<particle*>(other);

しかし、この方法は最も安全なものではありませんParticle3D。可能であれば、粒子が衝突したかどうかを確認したり、粒子のリストを保存してそれを使用したりできるようにするクラスでオーバーライドできるメソッドがいくつかあることを確認してください。をリストして、継承されたタイプのパーティクルを確認します。
もちろんdynamic_cast、より適切で安全ですが、RTTI はコードの実行を大幅に遅くするため、RTTI を使用することはお勧めしません。

于 2013-07-23T08:21:16.093 に答える
0

パーティクルを調べるときは、すべてのオブジェクトを基本クラスにキャストする必要があります。技術的には、次のような配列を使用できます。

std::vector <Particle3D*> particles;

独自のパーティクルはこのクラスから継承されているため、次の操作を実行できます。

particle* yourParticle = new particle();
particles.push_back(yourParticle);

yourParticle は Particle3D を基本クラスとして持つクラスであるため、これを行うことができます。これは、オブジェクト指向プログラミングの多くの機能の 1 つにすぎません。

于 2013-07-23T08:22:58.780 に答える