首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在应用程序中使用void ContactListener::PreSolve(b2Contact* contact,const b2Manifold* oldManifold)方法?

如何在应用程序中使用void ContactListener::PreSolve(b2Contact* contact,const b2Manifold* oldManifold)方法?
EN

Stack Overflow用户
提问于 2012-07-11 19:58:27
回答 2查看 409关注 0票数 1

我不知道如何在我的应用程序中使用此方法

代码语言:javascript
复制
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方法中,我检查接触并播放声音,这种方法的问题是,当一个物体不断地与静态物体接触时,声音会无限地叠加在前一个物体上,所以最后我会有巨大的噪音。我能做些什么来避免这种情况?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-28 21:51:10

您刚刚在update方法中使用了以下方法,并在调度update方法调用之前声明了它的对象。类似于HelloWorldLayer.h

代码语言:javascript
复制
MyContactListener *contactListener;

在HelloworldLayer.mm中

在此之前

代码语言:javascript
复制
[self scheduleupdate];

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

那么这种类型的错误就不会发生。

票数 1
EN

Stack Overflow用户

发布于 2012-07-11 21:15:32

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

代码语言:javascript
复制
BeginContact

PreSolve
PostSolve
PreSolve
PostSolve
...etc

EndContact

因此,如果要为每个碰撞检测一次实体之间的碰撞,请改用BeginContactEndContact。但是,这些方法只接受一个b2Contact参数,因此您可能需要在计算中不使用oldManifold值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11432170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档