Мяч плавающий в Box2D (SFML) - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь заставить 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: Здесь файлы заголовков для Ball иBox классы:

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;
};
...