3

衝突検出のみに Box2D を使用しています。私のコードは、Ray Wenderlich のチュートリアルのコードと似ています

この方法で問題が発生しています。コードは Box2D シミュレーションをバイパスするため、衝突応答はありません。したがって、スプライトはオーバーラップできます。Box2D 衝突 API が、衝突の解決に役立つ単位法線ベクトルを提供していることを認識しています。ただし、このベクトルは方向を伝えますが、大きさは伝えません。したがって、重なっているスプライトをどこまで移動すればよいか判断できません。Box2D コリジョン API を使用してオーバーラップを手動で解決する方法を知っている人はいますか?

4

1 に答える 1

1

iOS のことはわかりませんが、b2ContactListener を拡張して PreSolve をオーバーライドすることをお勧めします。

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

contact->SetEnabled(false) を設定すると、衝突が発生しますが、影響はありません。衝突が発生したら、以下のようなことができます。

const b2Manifold* マニホールド = 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;
    } 
于 2013-05-01T22:24:37.773 に答える