Box2D仅适用于碰撞检测

问题描述:

我仅将Box2D用于碰撞检测。我的代码类似于Ray Wenderlich的教程hereBox2D仅适用于碰撞检测

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

+0

你如何同步精灵位置与他们身体的位置?你是否踏上了Box2D的世界并将身体位置应用于精灵,或者你是否移动了精灵并将精灵位置应用于身体? – LearnCocos2D 2013-05-01 00:53:34

+0

@ LearnCocos2D我移动精灵并将它们的位置应用到身体。 – 2013-05-01 02:00:20

我不知道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; 
    }