Box2D仅用于碰撞检测

时间:2013-04-30 21:30:36

标签: ios cocos2d-iphone box2d collision overlap

我只使用Box2D进行碰撞检测。我的代码类似于Ray Wenderlich的教程here

我遇到了这种方法的问题。由于代码绕过Box2D模拟,因此没有碰撞响应。因此,精灵可以重叠。我知道Box2D碰撞API提供了一个单位法向量来帮助解决冲突。然而,这个向量传达方向但不传递幅度。因此,我无法确定移动重叠精灵的距离。有谁知道如何使用Box2D碰撞API手动解决重叠?

1 个答案:

答案 0 :(得分:1)

我不知道iOS的东西,但你想要做的是扩展b2ContactListener并覆盖PreSolve。

void PreSolve(b2Contact* contact, const b2Manifold* oldManifold);

如果你设置了contact-> SetEnabled(false),你将会发生碰撞,但不会对其进行操作。一旦发生碰撞,您可以执行类似下面的操作。

const b2Manifold * manifold = contact-> GetManifold();

    if (manifold->m_pointCount == 0)
    {
        return;
    }

    b2Fixture* fixtureA = contact->GetFixtureA();
    b2Fixture* fixtureB = contact->GetFixtureB();

    b2PointState state1[b2_maxManifoldPoints], state2[b2_maxManifoldPoints];
    b2GetPointStates(state1, state2, oldManifold, manifold);

    b2WorldManifold worldManifold;
    contact->GetWorldManifold(&worldManifold);

    for (int32 i = 0; i < manifold->m_pointCount && m_pointCount < k_maxContactPoints; ++i)
    {
        ContactPoint* cp = m_points + m_pointCount;
        cp->fixtureA = fixtureA;
        cp->fixtureB = fixtureB;
        cp->position = worldManifold.m_points[i];
        cp->normal = worldManifold.m_normal;
        cp->state = state2[i];
        ++m_pointCount;
    }