gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:59:59 25 4
gpt4 key购买 nike

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

我需要 Box2D 主体和 C++ 中的固定装置来与 QML 中的所有 Box2D 主体发生碰撞。执行此操作的正确方法是什么?

最佳答案

注意 - Box2DBody 不是可视项,因为它派生自 QObject。它只将物理属性添加到它的目标。无论如何,我认为创建物理实体的最简单方法是在 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
}
}

现在我们要“复活”它:

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();
}

关于c++ - 获取在 C++ 中创建的 Box2D 主体以与 QML 中的 Box2D 主体发生碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32193696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com