获取在 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();
}
我正在使用 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();
}