1

アプリケーションでこのメソッドを使用する方法がわかりません

void MyContactListener::PreSolve(b2Contact* contact, const b2Manifold* oldManifold) {

    b2WorldManifold worldManifold;

    contact->GetWorldManifold(&worldManifold);

    b2PointState state1[2], state2[2];

    b2GetPointStates(state1, state2, oldManifold, contact->GetManifold());
    //NSLog(@"Presolving");

    if (state2[0] == b2_addState)
    {
        const b2Body* bodyA = contact->GetFixtureA()->GetBody();

        const b2Body* bodyB = contact->GetFixtureB()->GetBody();

        b2Vec2 point = worldManifold.points[0];

        b2Vec2 vA = bodyA->GetLinearVelocityFromWorldPoint(point);

        b2Vec2 vB = bodyB->GetLinearVelocityFromWorldPoint(point);

        b2Vec2 rV = vB - vA;

        float32 approachVelocity = b2Dot(rV, worldManifold.normal);

        if (-1.5f < approachVelocity && approachVelocity < 0.0f)       
        {

            //MyPlayCollisionSound();
            NSLog(@"Not Playing Sound");

        }
        else 
        {
            NSLog(@"playing the sound");

        }

    }

}

HelloWorldLayer.mm でこのコードを使用するにはどうすればよいですか。助けてください... ここで問題があります。いくつかのボディが落下して静的なボディにぶつかるシーンがあり、エッジも同様です。b2ContactListener を実装し、tick メソッドで接触をチェックして音を再生します。このアプローチの問題は、体が静的な体と常に接触している場合、音が前の音に重なって無期限に再生されるため、最後に大きなノイズが発生することです。この状況を回避するには?

私を助けてくださいありがとう......

4

2 に答える 2

1

次のメソッドを更新メソッドに使用し、スケジュール更新メソッド呼び出しの前にそのオブジェクトを宣言しました。HelloWorldLayer.h のように

MyContactListener *contactListener;

そして HelloworldLayer.mm で

[self scheduleupdate];

contactListener=new MyContactListener();
world->setContactListener(contactListener);

このタイプのエラーよりも発生しません。

于 2012-08-28T13:51:10.427 に答える
0

2 つのボディが衝突するb2ContactListenerと、次の順序でメソッドが呼び出されます。

BeginContact

PreSolve
PostSolve
PreSolve
PostSolve
...etc

EndContact

そのため、衝突ごとに 1 回ボディ間の衝突を検出する場合は、代わりにBeginContactorを使用します。EndContactただし、これらのメソッドは単一のパラメーターしか使用しないため、計算で値b2Contactを使用しないようにする必要がある場合があります。oldManifold

于 2012-07-11T13:15:32.003 に答える