2016-01-12 91 views
4

我正在使用Box2D和SFML创建一个简单的游戏。但是,我的物体(球)在撞击地面后并未完全着陆。似乎有50%的球穿过了我的边界,看起来非常尴尬。下面是一些图片的插图。带有SFML对象的Box2D在碰撞后发生椭圆和相互碰撞

之前将球:

enter image description here

球击中边在地上后:

enter image description here

正如你可以看到,球的50%已经dissapeared(最可能是由于抵消或什么)。谁知道怎么修它?

下面是我为创建对象代码:

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

也许你实际上是更新的位置,并已检测到碰撞后,你应该简单地回滚最后一次更新。无论如何,很难说,你没有显示足够的代码... – skypjack

回答

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