仅用于碰撞检测的Box2D

3
我仅使用Box2D进行碰撞检测。我的代码类似于Ray Wenderlich的教程这里中的代码。
我遇到了一个问题。由于代码绕过了Box2D模拟,因此没有碰撞响应。因此,精灵可以重叠。我知道Box2D碰撞API提供一个单位法线向量来帮助解决碰撞。然而,该向量传达方向但不传达大小。因此,我无法确定我应该将重叠的精灵移动多远。有谁知道如何使用Box2D碰撞API手动解决重叠问题吗?

你如何同步精灵的位置和它们身体的位置?你是在Box2D世界中进行步进并将身体位置应用于精灵,还是移动精灵并将精灵位置应用于身体? - CodeSmile
@LearnCocos2D 我移动精灵并将它们的位置应用于物体。 - Sam Hertz
1个回答

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;
    } 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接