Расширенное обнаружение столкновений в Box2D - точка столкновения, сила и т. Д. - PullRequest
2 голосов
/ 10 октября 2011

Я пишу простую игру для iOS с использованием Cocos2d с Box2d.У меня уже работает обнаружение столкновений, но не так, как я хочу.Я расширил b2ContactListener и обнаружив столкновения объектов следующим образом:

void ContactListener::BeginContact(b2Contact* contact)
{
    b2Body *aBody = contact->GetFixtureA()->GetBody();
    b2Body *bBody = contact->GetFixtureB()->GetBody();

    // collision between aBody and bBody occurred

}

Я не могу узнать, как получить точку столкновения и, если возможно, силу удара при столкновении.Есть несколько уроков, как получить точки столкновения, но ни один из них не работает для меня.Я нашел несколько примеров, которые использовали b2CollisionPoint, но похоже, что это не работает в текущей версии Box2d.В других примерах реализован метод Result для b2CollisionPoint, но он также не работает - похоже, он применяется к предыдущей версии Box2d или версиям для другой платформы (Java или Flash).

Чтобы быть более точным вмоя проблема, вот пример того, чего я хочу достичь: мне нужно обнаружить столкновение между игровыми объектами.Я уже могу определить, сталкивается ли устройство игрока с наземным устройством, но мне нужно знать, просто ли игрок «стоит» на земле или сталкивается с ним снизу (представьте себе игру в платформу и игрока, который ударяет по платформепосле прыжка) или другой стороной (игрок прыгает в вертикальную стену).Мне будет намного легче сделать это, если я смогу получить точку столкновения.Это было бы полезно и во многих других случаях.

1 Ответ

3 голосов
/ 13 ноября 2011

это сработало для меня: http://www.cocos2d -iphone.org / форум / тема / 6024

void ContactListener::PostSolve(b2Contact* contact, 
                                  const b2ContactImpulse* impulse) {

    // find the strength of the impulse..
    int32 count = contact->GetManifold()->pointCount;
    float32 maxImpulse = 0.0f;
    for (int32 i = 0; i < count; ++i) {
        maxImpulse = b2Max(maxImpulse, impulse->normalImpulses[i]);
    }

    NSLog(@"maxImpulse: %f", maxImpulse);
}
...