我正在使用Box2D和SFML创建一个简单的游戏。然而,我的物体(球)撞击地面后并没有完全落地。似乎50%的球已经通过我的边界,这看起来很尴尬。下面是一些图片。
球之前:球击中地面边界后:
正如你所看到的,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。 有谁可以帮我这个?感谢。
答案 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));