Как изменить угол поворота спрайта героя?

Как можно повернуть спрайт в sfml так, чтобы он всегда направлялся к курсору мыши?
  • 23 августа 2024 г. 17:23
Ответы на вопрос 2
Для изменения угла поворота спрайта героя в SFML можно использовать метод setRotation(), принимающий угол в градусах в качестве параметра. 

Чтобы спрайт всегда направлялся к курсору мыши, можно использовать функцию sf::Vector2i sf::Mouse::getPosition(const sf::Window& relativeTo), чтобы получить текущее положение курсора мыши относительно окна игры, затем вычислить угол между позицией спрайта героя и позицией курсора мыши, и установить этот угол как угол поворота спрайта. Вот пример кода:

```cpp
// Получаем позицию курсора мыши
sf::Vector2i mousePosition = sf::Mouse::getPosition(window);

// Получаем позицию спрайта героя
sf::Vector2f heroPosition = heroSprite.getPosition();

// Вычисляем угол между позицией спрайта и позицией курсора мыши
float angle = atan2(mousePosition.y - heroPosition.y, mousePosition.x - heroPosition.x);
angle = angle * 180 / M_PI; // Переводим радианы в градусы

// Устанавливаем угол как поворот спрайта героя
heroSprite.setRotation(angle);
```

Таким образом, спрайт героя будет всегда поворачиваться так, чтобы указывать на курсор мыши.
#include <SFML/Graphics.hpp>
#include <cmath>

int main() {
    sf::RenderWindow window(sf::VideoMode(800, 600), "Hand Mouse");

    sf::Texture handTexture;
    if (!handTexture.loadFromFile("hand.png")) {
        return -1;
    }
    sf::Sprite handSprite(handTexture);

    // Установка центра вращения спрайта в его середину
    handSprite.setOrigin(handTexture.getSize().x / 2, handTexture.getSize().y / 2);

    // Установка начальной позиции спрайта руки
    handSprite.setPosition(400, 300); // Например, в центр экрана

    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        sf::Vector2i mPos = sf::Mouse::getPosition(window);
        
        // Преобразование векторных координат мыши в координаты окна
        sf::Vector2f mPosF(static_cast<float>(mPos.x), static_cast<float>(mPos.y));

        // Вычисление разницы между позицией руки и курсора
        sf::Vector2f direction = mPosF - handSprite.getPosition();
        
        // Вычисление угла поворота в радианах
        float angle = std::atan2(direction.y, direction.x);

        // Конвертация угла из радианов в градусы
        float angleDegrees = angle * 180.f / 3.14159f;

        handSprite.setRotation(angleDegrees);

        window.clear();
        window.draw(handSprite);
        window.display();
    }

    return 0;
}
Похожие вопросы