Задать вопрос

Правильно ли реализован код с использованием Box2d и SFML?

Недавно я начал изучать библиотеку 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;
}
  • Вопрос задан
  • 86 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы