// Определение угла между взглядом героя и направлением на курсор
float angleDegrees = std::atan2(direction.y, direction.x) * 180.f / 3.14159f;
// Проверка, если угол больше 90 градусов или меньше -90 градусов
if (angleDegrees > 90.f || angleDegrees < -90.f) {
handSprite.setScale(1.f, -1.f); // Переворачиваем руку по вертикали
angleDegrees += 180.f; // Корректируем угол на противоположный
} else {
handSprite.setScale(1.f, 1.f); // Восстанавливаем нормальный масштаб
}
// Поворот спрайта
handSprite.setRotation(angleDegrees);
// Предположим, что у вас есть спрайт тела
sf::Sprite bodySprite(bodyTexture);
// Установка позиции тела
bodySprite.setPosition(400, 300);
// Обновление позиции руки каждый кадр в зависимости от позиции тела
handSprite.setPosition(bodySprite.getPosition() + sf::Vector2f(20.f, 10.f)); // Смещение по x и y относительно тела
#include <SFML/Graphics.hpp>
#include <cmath>
int main() {
sf::RenderWindow window(sf::VideoMode(800, 600), "Rotate Hand Towards Mouse");
sf::Texture bodyTexture, handTexture;
// Загрузка текстур тела и руки
if (!bodyTexture.loadFromFile("body.png") || !handTexture.loadFromFile("hand.png")) {
return -1;
}
sf::Sprite bodySprite(bodyTexture);
sf::Sprite handSprite(handTexture);
// Установка центра вращения спрайта руки
handSprite.setOrigin(handTexture.getSize().x / 2, handTexture.getSize().y / 2);
// Установка позиции тела
bodySprite.setPosition(400, 300);
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed)
window.close();
}
// Получение позиции курсора
sf::Vector2i mousePos = sf::Mouse::getPosition(window);
sf::Vector2f mousePosF(static_cast<float>(mousePos.x), static_cast<float>(mousePos.y));
// Вычисление направления от тела до курсора
sf::Vector2f direction = mousePosF - bodySprite.getPosition();
// Вычисление угла поворота
float angleDegrees = std::atan2(direction.y, direction.x) * 180.f / 3.14159f;
// Проверка направления и корректировка угла
if (angleDegrees > 90.f || angleDegrees < -90.f) {
handSprite.setScale(1.f, -1.f); // Переворот руки
angleDegrees += 180.f; // Корректировка угла
} else {
handSprite.setScale(1.f, 1.f); // Нормальный масштаб
}
// Установка позиции руки относительно тела
handSprite.setPosition(bodySprite.getPosition() + sf::Vector2f(20.f, 10.f)); // Смещение для руки
// Поворот руки
handSprite.setRotation(angleDegrees);
window.clear();
window.draw(bodySprite);
window.draw(handSprite);
window.display();
}
return 0;
}