Box2d и SFML | Как создать треугольник с адекватной физикой?
Не как не получается написать класс Triangle
, объект которого будет работать нормально. Объект класса Triangle
не сталкивается с остальными физическими объектами. Для создания треугольника использую sf::ConvexShape
, методы для обновления и рендеринга а так же конструктор класса я оставлю ниже.
Triangle::Triangle(b2World* world, float base, float height, float x, float y)
:_world(world)
{
this->_triangle.setPointCount(3);
this->_triangle.setPoint(0, sf::Vector2f(0.0f, 0.0f));
this->_triangle.setPoint(1, sf::Vector2f(base, 0.0f));
this->_triangle.setPoint(2, sf::Vector2f(base / 2.0f, -height));
this->_triangle.setFillColor(sf::Color::Blue);
this->_triangle.setPosition(sf::Vector2f(x, y));
this->setOriginToCenter();
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(x + base / 2, y - height / 2);
this->_body = this->_world->CreateBody(&bodyDef);
if (!this->_body)
{
std::cerr << "Warning: _body is nullptr in Triangle::Triangle" << std::endl;
}
b2PolygonShape triangleShape;
b2Vec2 vertices[3];
vertices[0].Set(0.0f, 0.0f);
vertices[1].Set(base, 0.0f);
vertices[2].Set(base / 2, -height);
triangleShape.Set(vertices, 3);
b2FixtureDef fixtureDef;
fixtureDef.shape = &triangleShape;
fixtureDef.density = 1.0f;
fixtureDef.friction = 0.5f;
this->_body->CreateFixture(&fixtureDef);
}
void Triangle::update(float deltaTime, sf::RenderWindow& window)
{
this->_world->Step(deltaTime, 8, 3);
b2Vec2 position = this->_body->GetPosition();
float angle = this->_body->GetAngle();
_triangle.setPosition(position.x, position.y);
_triangle.setRotation(angle * (180.0f / b2_pi));
}
void Triangle::render(sf::RenderWindow& window)
{
window.draw(_triangle);
}