c – 具有SFML对象的Box2D是ovverlapping并在碰撞后相互交叉

我正在使用Box2D和SFML来创建一个简单的游戏.然而,我的物体(球)撞击地面后并没有完全落地.似乎50%的球已经通过我的边界,这看起来很尴尬.下面是一些图片用于说明.

球之前:

《c – 具有SFML对象的Box2D是ovverlapping并在碰撞后相互交叉》

球击中地面边界后:

《c – 具有SFML对象的Box2D是ovverlapping并在碰撞后相互交叉》

如你所见,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);

其中radius = 32.
有谁可以帮我这个?谢谢.

最佳答案 Box2d使用圆/多边形的中心作为位置,而SFML使用精灵/形状的左上角作为位置,因此在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));
点赞