Box2D только для обнаружения столкновений

Я использую Box2D только для обнаружения столкновений. Мой код похож на тот, что описан в руководстве Рэя Вендерлиха.

Я столкнулся с проблемой с этим методом. Поскольку код обходит моделирование Box2D, ответ на столкновение отсутствует. Следовательно, спрайты могут перекрываться. Мне известно, что API столкновения Box2D предоставляют единичный вектор нормали, помогающий разрешать столкновения. Однако этот вектор передает направление, а не величину. Поэтому я не могу определить, как далеко я должен перемещать перекрывающиеся спрайты. Кто-нибудь знает, как использовать API столкновения Box2D для ручного разрешения перекрытия?

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;
    } 
Другие вопросы по тегам