Недавно я начал изучать библиотеку Box2D для создания 2D физики в играх. В рамках этого изучения я написал тестовый код, в котором реализовал куб, обладающий свойством гравитации, и платформу, на которую этот куб должен падать. Однако, по непонятным причинам, куб не падает, что вызывает у меня затруднения в отладке.
Вот мой код:
#include <SFML/Graphics.hpp>
#include <iostream>
#include <Box2D/Box2D.h>
const float WORLD_WIDTH = 800.0f;
const float WORLD_HEIGHT = 600.0f;
const float PIXELS_PER_METER = 30.0f;
int main()
{
// Создаем окно
sf::RenderWindow window(sf::VideoMode(WORLD_WIDTH, WORLD_HEIGHT), "Box2D and SFML Example");
// Создаем физический мир
b2Vec2 gravity(1.0f, 9.81f); // Устанавливаем гравитацию
b2World world(gravity);
// Создаем ground body
b2BodyDef groundBodyDef;
groundBodyDef.position.Set(WORLD_WIDTH / 2 / PIXELS_PER_METER, WORLD_HEIGHT / PIXELS_PER_METER);
b2Body* groundBody = world.CreateBody(&groundBodyDef);
// Определяем форму ground
b2PolygonShape groundBox;
groundBox.SetAsBox(WORLD_WIDTH / 2 / PIXELS_PER_METER, 10.0f); // ширина, высота
groundBody->CreateFixture(&groundBox, 0.0f);
// Создаем динамическое тело
b2BodyDef dynamicBodyDef;
dynamicBodyDef.type = b2_dynamicBody;
dynamicBodyDef.position.Set(WORLD_WIDTH / 4 / PIXELS_PER_METER, WORLD_HEIGHT / 4 / PIXELS_PER_METER);
b2Body* dynamicBody = world.CreateBody(&dynamicBodyDef);
// Определяем форму динамического тела
b2PolygonShape dynamicBox;
dynamicBox.SetAsBox(50.0f / PIXELS_PER_METER, 50.0f / PIXELS_PER_METER);
b2FixtureDef fixtureDef;
fixtureDef.shape = &dynamicBox;
fixtureDef.density = 1.0f;
fixtureDef.friction = 0.3f;
dynamicBody->CreateFixture(&fixtureDef);
// Рисуем физические тела
sf::RectangleShape ground(sf::Vector2f(WORLD_WIDTH, 20));
ground.setPosition(0, WORLD_HEIGHT - 10);
ground.setFillColor(sf::Color::Green);
sf::RectangleShape box(sf::Vector2f(100, 100));
box.setPosition(dynamicBody->GetPosition().x * PIXELS_PER_METER - 50,
dynamicBody->GetPosition().y * PIXELS_PER_METER - 50);
box.setRotation(dynamicBody->GetAngle() * (180.0f / b2_pi)); // Преобразование радианов в градусы
box.setFillColor(sf::Color::Blue);
// Основной цикл программы
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
else if (event.type == sf::Event::KeyPressed)
if (event.key.code == sf::Keyboard::Escape)
window.close();
}
world.Step(1.0f / 60.0f, 6, 2);
window.clear(sf::Color::White);
window.draw(ground);
window.draw(box);
window.display();
}
return 0;
}