获取在 C++ 中创建的 Box2D 主体以与 QML 中的 Box2D 主体发生碰撞

Getting a Box2D body created in C++ to collide with Box2D bodies in QML

我正在使用 qml-box2d 库。我想在 C++ 中创建一个带有固定装置的 Box2D 主体,并在 QML 中使用它。不幸的是,每当我创建一个 b2Body 对象并为该对象创建固定装置时,我的应用程序都会崩溃。如果我使用 qml-box2d 库附带的 Box2DBody 对象,它不会显示在 QML 中。

我需要在 C++ 中使用固定装置的 Box2D 主体来与 QML 中的所有 Box2D 主体发生碰撞。这样做的正确方法是什么?

注意 - Box2DBody 不是视觉项,因为它派生自 QObject。它仅将物理属性添加到其 target。无论如何,我认为创建物理身体的最简单方法是在 QML 中进行。但是如果你仍然想在 C++ 中这样做,你可以使用下面的代码。假设,我们在 main.qml 中有一个带有 QML rect 项目的场景:

Window {
    width: 800
    height: 600
    visible: true

    World {}

    Rectangle {
        objectName: "rect"
        width: 100
        height: 100
        x: 350
        y: 50
        color: "green"
    }

    Rectangle {
        id: floor
        height: 50
        anchors {
            left: parent.left
            right:  parent.right
            bottom: parent.bottom
        }
        color: "brown"
        Body {
            target: floor
            fixtures: Box {
                width: floor.width
                height: floor.height
                density: 0.5
                friction: 0.5
                restitution: 0.5
            }
        }
    }

    DebugDraw {
        visible: true
        opacity: 0.7
    }
}

现在我们要"revive"它:

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    Box2DPlugin plugin;
    plugin.registerTypes("Box2D");

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    QObject *root = engine.rootObjects()[0];
    QQuickItem *rect = root->findChild<QQuickItem *>("rect");

    Box2DBody * body = new Box2DBody(root);
    body->setBodyType(Box2DBody::Dynamic);
    body->setTarget(rect);
    Box2DBox * fixture = new Box2DBox(rect);
    fixture->setWidth(rect->width());
    fixture->setHeight(rect->height());
    fixture->setDensity(0.8);
    fixture->setFriction(0.5);
    fixture->setRestitution(0.5);
    body->addFixture(fixture);
    body->componentComplete();

    return app.exec();
}