我正在使用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);
其中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));