Я пытаюсь заставить Box2D работать с SFML, хотя у меня возникают некоторые проблемы, подобные этой:
По некоторым причинампросто останавливается, прежде чем ударить по платформе.Я попытался изменить положение шара по оси 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;
};