Box2D与SFML对象在碰撞后重叠并互相穿过。

4
我正在使用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。有人可以帮我吗?谢谢。


可能你实际上正在更新位置,当检测到碰撞时应该简单地回滚最后一次更新。无论如何,很难说,因为你没有展示足够的代码... - skypjack
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接