Box2D ContactListener未检测到碰撞

时间:2018-02-19 04:07:00

标签: c++ box2d sfml

我试图使用b2ContactListener类检测静态物体和运动物体之间的碰撞,但我的代码没有检测到我的两个灯具之间的碰撞。我将EdgeShape放置在我的运动体顶部,并将其作为一个夹具来检测与我的静态身体夹具的碰撞。我正在使用SFML绘制到屏幕并检测键盘事件。

这是我的主要功能:

int main()
{
    Vector2f resolution;
    resolution.x = VideoMode::getDesktopMode().width;
    resolution.y = VideoMode::getDesktopMode().height;

    RenderWindow window(VideoMode(resolution.x, resolution.y),
        "Box2D Test", Style::Fullscreen);

    Vector2f staticRectSize(100.0f, 20.0f);
    Vector2f kinematicRectSize(40.0f, 20.0f);

    Event keyBoardEvent;

    b2Vec2 gravity(0.0f, 0.0f);

    b2World world(gravity);

    // Creating static body and fixture
    b2BodyDef groundBodyDef;
    groundBodyDef.position.Set(100.0f, 150.0f);

    b2Body* groundBody = world.CreateBody(&groundBodyDef);

    b2PolygonShape groundBox;

    groundBox.SetAsBox(50.0f, 10.0f);

    groundBody->CreateFixture(&groundBox, 0.0f);

    // Creating kinematic body and fixture
    b2BodyDef bodyDef;
    bodyDef.type = b2_kinematicBody;
    bodyDef.position.Set(125.0f, 700.0f);
    b2Body* body = world.CreateBody(&bodyDef);

    b2PolygonShape kinematicBox;
    kinematicBox.SetAsBox(20.0f, 10.0f);

    b2FixtureDef fixtureDef;
    fixtureDef.shape = &kinematicBox;

    fixtureDef.density = 1.0f;

    fixtureDef.friction = 0.3f;

    body->CreateFixture(&fixtureDef);

    // world.Step inputs
    float32 timeStep = 1.0f / 60.0f;
    int32 velocityIterations = 6;
    int32 positionIterations = 2;

    RectangleShape staticRect(staticRectSize);
    RectangleShape dynamicRect(kinematicRectSize);

    b2Vec2 staticPosition = groundBody->GetPosition();
    staticRect.setPosition(staticPosition.x, staticPosition.y);

    b2Vec2 dynamicPosition = body->GetPosition();

    // Creating EdgeShape
    b2EdgeShape top;
    top.Set(b2Vec2(dynamicPosition.x, dynamicPosition.y), b2Vec2(dynamicPosition.x + 40.0, dynamicPosition.y));
    fixtureDef.shape = ⊤
    fixtureDef.isSensor = true;
    body->CreateFixture(&fixtureDef)->SetUserData("top collision");

    // Creating an instance of myContactListener class
    myContactListener contactListener;
    world.SetContactListener(&contactListener);

    while (window.isOpen())
    {
        world.Step(timeStep, velocityIterations, positionIterations);

        dynamicPosition = body->GetPosition();

        dynamicRect.setPosition(dynamicPosition.x, dynamicPosition.y);

        while (window.pollEvent(keyBoardEvent))
        {
            if (keyBoardEvent.type == Event::KeyPressed)
            {
                if (keyBoardEvent.key.code == Keyboard::W)
                {
                    body->SetLinearVelocity(b2Vec2(0, -10));
                }
    ...

            window.clear();
            window.draw(staticRect);
            window.draw(dynamicRect);
            window.draw(line);
            window.display();

            if (Keyboard::isKeyPressed(Keyboard::Escape))
            {
                break;
            }
        }
        return 0;
    }

这是我的MyContactListiner.cpp:

void myContactListener::BeginContact(b2Contact* contact)
{
    b2Fixture *fa = contact->GetFixtureA();
    b2Fixture *fb = contact->GetFixtureB();

    if (fa == NULL || fb == NULL) { return; }

    while (1)
    {
        printf("Collision occurred");

        if (Keyboard::isKeyPressed(Keyboard::Escape))
        {
            break;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

Box2D不会对静态物体直接对其他静态或运动物体进行碰撞处理。它们在理论上都是无限质量的,运动定律似乎不再有意义(至少在碰撞方面不是我的意思)。

可能最容易使运动物体成为动态物体。

您也可以使用动态主体围绕其中一个主体,以启动联系人侦听器。动态物体不能用来驱动它所包围的运动物体或静态物体,但是在子步骤阶段不会比我认为值得花费更多的努力。

希望这个答案有所帮助!

相关问题