1

我不知道如何在我的应用程序中使用这个metnod

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,并在我的刻度方法中我正在检查接触并播放声音,这种方法的问题是,当一个身体不断与静态身体接触时,声音会无限期地覆盖前一个,所以最后我有很大的噪音..我能做什么怎样避免这种情况?

请帮帮我谢谢......

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

当两个物体发生碰撞时,b2ContactListener方法按以下顺序调用:

BeginContact

PreSolve
PostSolve
PreSolve
PostSolve
...etc

EndContact

因此,如果您想为每次碰撞检测一次身体之间的碰撞,请使用BeginContactorEndContact代替。不过,这些方法只采用一个b2Contact参数,因此您可能需要取消oldManifold在计算中使用该值。

于 2012-07-11T13:15:32.003 回答