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

时间:2016-01-12 06:54:32

标签: 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。 有谁可以帮我这个?感谢。

1 个答案:

答案 0 :(得分:2)

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