c++ - 具有 SFML 对象的 Box2D 在碰撞后重叠并相互重叠

标签 c++ box2d collision sfml

我正在使用 Box2D 和 SFML 创建一个简单的游戏。但是,我的物体(球)落地后并没有完全落地。好像有50%的球都过了我的边界,看起来真的很别扭。以下是一些图片以供说明。

球之前:

enter image description here

球在地面上击中边界后:

enter image description here

如您所见,50% 的球已经消失(很可能是由于偏移或其他原因)。有人知道怎么解决吗?

下面是我创建对象的代码:

    circ_ = sf::CircleShape(radius);
    circ_.setOrigin(sf::Vector2f(size.x/2,size.y/2));
    circ_.setFillColor(sf::Color(255, 255, 255, 255));
    circ_.setOutlineThickness(1);
    circ_.setOutlineColor(sf::Color::Black);

    bodyDef_.position = b2Vec2(position.x/PIXEL_PER_METER, position.y/PIXEL_PER_METER);
    
    bodyDef_.type = b2_staticBody;
    bodyFixtureDef_.density = 1.0f;
    bodyFixtureDef_.friction = 0.3f;
    bodyFixtureDef_.restitution = 0.8f;

在我的 SFML 代码中,我使用以下方法创建了 Box2D 对象:

Ball basketBall(world, basketBallSize, basketBallPos, 0.0, basketBallRadius, false);

其中半径 = 32。 有人可以帮我吗?谢谢。

最佳答案

Box2d 使用圆形/多边形的中心作为位置,而 SFML 使用 Sprite /形状的左上角作为位置,因此在 SFML 和 Box2d 位置之间转换时需要考虑到这一点。还要记住,Box2d 使用米而不是像素,使用弧度而不是度数。

就这样做:

#include <cmath> // for M_PI define

Sprite.setPosition(sf::Vector2f(b2BallBody->GetPosition().x * PIXEL_PER_METER - Sprite.getGlobalBounds().width * 0.5f,
                                b2BallBody->GetPosition().y * PIXEL_PER_METER - Sprite.getGlobalBounds().height * 0.5f));
Sprite.setRotation(b2BallBody->GetAngle() * (float)(180.0 / M_PI));

关于c++ - 具有 SFML 对象的 Box2D 在碰撞后重叠并相互重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34737280/

相关文章:

java - 在 LibGDx 中添加 rayhandler 会导致 InputListener 出现问题

java - Libgdx 球赛

java - 如何让我的图像出现在随机位置?

javascript - 游戏未检测到角色与边框之间的碰撞

java - 矩形碰撞 - 不需要的重叠。 (处理IDE)

C++:使用模板变量进行优化

c++ - 我的线程可以帮助操作系统决定何时将其切换出来吗?

c++ - 如何在 C++ 中将元数据添加到流式 grpc 调用

javascript - 让 dampingRatio 与 Box2D 和 DistanceJoint 一起工作

c++ - 用C和C++调用的(…)是什么?