浮在Box2D中的球(SFML)

时间:2019-03-03 18:11:27

标签: c++ box2d sfml

尽管我遇到类似以下问题,但我正在尝试让Box2D与SFML一起使用:

enter image description here

由于某种原因,球在撞上平台之前就停了下来。我试图在X轴上改变球的位置,但它掉到了窗外,所以我想画图了。由于SFML使用对象的左上角原点,但是Box2D使用它的中心,所以我不得不在box和ball的绘制函数中抵消它:

void Ball::draw(sf::RenderWindow & window)
{
circleS.setPosition(sf::Vector2f(body->GetPosition().x - (circle.m_radius 
/2), 
body->GetPosition().y - (circle.m_radius  2)));
circleS.setRotation(body->GetAngle() * (180.0f / 3.14159f));
window.draw(circleS);
}


void Box::draw(sf::RenderWindow & window)
{
boxShape.setPosition(sf::Vector2f(body->GetPosition().x - (dimension.x / 2), 
body->GetPosition().y - (dimension.y / 2)));
boxShape.setRotation(body->GetAngle() * (180.0f / 3.14159f));
window.draw(boxShape);
}

我不明白为什么这行不通,但是如果有帮助,我可以包括更多代码。感谢所有帮助。

编辑: 我用盒子代替了球,效果很好。然后我换回了球,底盒变成了静态球,它刚通过,这也是我的主要功能的片段:

RenderWindow window;
window.create(VideoMode(SCREENWIDTH, SCREENHEIGHT), "Pool game");
Event event;

//Setup for Box2D
b2Vec2 gravity(0.0f, 9.81f);
b2World world(gravity);

float32 timeStep = 1.0f / 60.0f;
int32 velocityIterations = 8;
int32 positionIterations = 3;

Box box(b2Vec2(100.0f, 400.0f), b2Vec2(100.0f, 20.0f), Color::Magenta, 
world);
Ball ball(b2Vec2(50.0f, 50.0f), 9.0f, Color::Blue, world, true);

//game loop
while (window.isOpen()) {
    //window closure
    while (window.pollEvent(event)) {
        if (event.type == Event::Closed) {
            window.close();
        }
    }
    world.Step(timeStep, velocityIterations, positionIterations);
    //////// Drawing  ////////
    window.clear(Color(0,128,0));
    //------------------------------------------
    box.draw(window);
    ball.draw(window);
    //------------------------------------------
    window.display();
    //------------------------------------
}

编辑2: 这里是BallBox类的头文件:

class Box {
//Constructors
public:
Box(b2Vec2 position, b2Vec2 dimension, sf::Color c, b2World &world, bool 
isDynamic = false) : dimension(dimension) {
    if (isDynamic) bodyDef.type = b2_dynamicBody; else bodyDef.type = 
b2_staticBody;
    bodyDef.position.Set(position.x , position.y );
    body = world.CreateBody(&bodyDef);

    dynamicBox.SetAsBox(dimension.x / 2, dimension.y / 2 );

    fixtureDef.shape = &dynamicBox;
    fixtureDef.density = 1.0f;
    fixtureDef.friction = 0.3f;

    body->CreateFixture(&fixtureDef);

    boxShape.setPosition(sf::Vector2f(body->GetPosition().x - (this- 
>dimension.x / 2), body->GetPosition().y - (this->dimension.y / 2)));
    boxShape.setSize(sf::Vector2f(this->dimension.x, this->dimension.y));
    boxShape.setFillColor(c);
}
~Box() {
    body = nullptr;
}
//Functions
public:
void draw(sf::RenderWindow &window);
//Variables
public:
//Box2D
b2BodyDef bodyDef;
b2PolygonShape dynamicBox;
b2FixtureDef fixtureDef;
b2Body* body;
//SFML
sf::RectangleShape boxShape;
b2Vec2 dimension;
};

还有球:

class Ball {
//Constructors
public:
Ball(b2Vec2 position,float radius, sf::Color c, b2World &world, bool 
isDynamic = false) {
    if (isDynamic) bodyDef.type = b2_dynamicBody; else bodyDef.type = 
 b2_staticBody;
    bodyDef.position.Set(position.x , position.y );
    body = world.CreateBody(&bodyDef);

    circle.m_p.Set(position.x,position.y);
    circle.m_radius = radius + outlineThickness;

    fixtureDef.shape = &circle;
    fixtureDef.density = 1.0f;
    fixtureDef.friction = 0.3f;

    body->CreateFixture(&fixtureDef);

    circleS.setPosition(sf::Vector2f(body->GetPosition().x - 
(circle.m_radius / 2),body->GetPosition().y - (circle.m_radius / 2)));
    circleS.setRadius(radius);
    circleS.setOutlineThickness(outlineThickness); 
    circleS.setOutlineColor(sf::Color::Black);
    circleS.setFillColor(c);
}
~Ball() {
    body = nullptr;
}
//Functions
public:
void draw(sf::RenderWindow &window);
//Variables
public:
//Box2D
b2BodyDef bodyDef;
b2CircleShape circle;
b2FixtureDef fixtureDef;
b2Body* body;
//SFML
sf::CircleShape circleS;
float outlineThickness = 1.0f;
};

0 个答案:

没有答案