void SpriteContactListener::PreSolve(b2Contact* contact, const b2Manifold* oldManifold) { b2WorldManifold worldManifold; contact->GetWorldManifold(&worldManifold); b2PointState state1[2], state2[2]; b2GetPointStates(state1, state2, oldManifold, contact->GetManifold()); if (state2[0] == b2_addState) { const b2Body* bodyA = contact->GetFixtureA()->GetBody(); const b2Body* bodyB = contact->GetFixtureB()->GetBody(); b2Vec2 point = worldManifold.points[0]; b2Vec2 vA = bodyA->GetLinearVelocityFromWorldPoint(point); b2Vec2 vB = bodyB->GetLinearVelocityFromWorldPoint(point); float approachVelocity = abs(b2Dot(vB - vA, worldManifold.normal)); Sprite* spriteA = (Sprite*)bodyA->GetUserData(); Sprite* spriteB = (Sprite*)bodyB->GetUserData(); spriteA->Hit(spriteB, approachVelocity); spriteB->Hit(spriteA, approachVelocity); } return; }