Недавно я столкнулся с небольшой проблемой, когда пытался запрограммировать класс с несколькими спрайтами в SFML.
У меня есть контейнер с несколькими спрайтами, каждый из которых может иметь смещение масштаба, поворота и положения от центральной точки контейнера. Тем не менее, я сталкиваюсь с проблемой при попытке повернуть контейнер. Если я просто поверну отдельные спрайты, он не будет учитывать их смещение от центра контейнера (для некоторых битов пользовательского интерфейса это проблема). Немного покопавшись, я обнаружил, как получить их угол от центра и вычислить положение, в котором они должны оказаться при повороте. Однако я не знаю, как сохранить их вращательное вращение одинаковым. В принципе, я хочу быть в состоянии сделать это
И после вращения, это будет выглядеть так
Из-за того, как SFML обрабатывает поворот и начало координат, я не могу просто установить начало каждого спрайта в центр контейнера и повернуть. Мне нужно иметь какую-то функцию, которая вычисляет, куда они должны идти, а также ориентацию, которую они должны иметь относительно того, что они уже имели (поэтому, если спрайт имел угол 0, когда контейнер поворачивается на 90 градусов, он должен теперь имеет угол 90 градусов. Хотя, если он начинался с угла 90, его следует повернуть на 180 градусов после него, чтобы сохранить его вращение относительно остальных спрайтов в контейнере)
Код, который я использую для получения местоположения, он должен быть относительно контейнера при повороте выглядит следующим образом
float angle = atan2(p1.y -p2.y, p1.x - p2.x);
float x = radius * cos(angle);
float y = radius * sin(angle);
icon.set_position(x + spriteX, y + spriteY);
Спасибо за прочтение. Я никогда не был так хорош в математике, поэтому я не знаю, как понять это самостоятельно. Я даже не знал, что и почему, пока не начал исследовать эту проблему. X.x Любая помощь будет принята с благодарностью.
Вы знаете, как вращать спрайт, не перемещая его положение? Если это так, просто поверните сам фактический спрайт на тот же угол, который вы получаете, когда позиция на круге выше. Прямо сейчас вы вращаете позицию, используя sin и cos. Вам также нужно установить «Ориентацию» на тот же угол, который вы рассчитали: float angle = atan2(p1.y - p2.y, p1.x - p2.x);
Удачи!
-pBlack
Просто создайте вектор от центральной точки контейнера до спрайта. Затем поверните вектор, и вы получите новую позицию спрайта.