Intereting Posts

Как вращать актер изображения в libgdx по средней точке?

Если я правильно понимаю, LibGDX поворачивает изображение с помощью метода addActions:

this.addAction( parallel(rotateBy(360, 0.5f), moveTo(320, 100, 0.5f))); 

Дело в том, что оно поворачивается на точку = (0,0) изображения.

Вот мой вопрос:

Есть ли способ повернуть изображение по центральной точке объекта? Что-то вроде закрепления его посередине, а затем поворачивая его, как колесо в машине? Оба метода rotateBy и rotateTo поворачивают его по (0,0) точке самого изображения.

Solutions Collecting From Web of "Как вращать актер изображения в libgdx по средней точке?"

Вы должны правильно установить «происхождение» вашего актера. Вы можете прочитать в API-интерфейсе Actor, что начало координат относительно позиции и используется для масштабирования и вращения.

Итак, вычислите свою среднюю точку и установите начало в среднюю точку.

 Actor a; .... a.setOrigin(a.getWidth()/2, a.getHeight()/2); 

Самый простой способ – перевести объект, чтобы точка 0,0 была центром, поверните ее, а затем переведите обратно в нужное положение. Я не знаком с libGDX, но должен быть метод для агрегирования трех преобразований, то есть вы применяете только одно агрегированное преобразование к вашему объекту. Имейте в виду порядок, в котором вы объединяете преобразования, имеет значение.

Более сложный способ, который дает точно такой же результат, заключается в вычислении величины смещения, созданного поворотом, и перевода изображения обратно в исходное. Не делайте этого так. Сочетание трех простых преобразований – это путь и одна из лучших причин использования преобразований.

** Редактирование. Глядя на API, объект Actor имеет метод translate (). Используйте это, чтобы сдвинуть изображение, чтобы точка 0,0 находилась в центре. В psuedocode;

 x = this.getX(); y = this.getY(); cx = this.getWidth() * .5; cy = this.getHeight() * .5; this.translate(-(x+cx), -(y+cy)); // move so 0,0 is the centre of the Actor object this.rotate(thisMuch); // rotate the Actor this.translate((x+cx), (y+cy)); // move it back to its original location 

Это приведет к тому, что ваш объект будет вращаться по его центральной точке, на месте. Он выглядит запутанным, но довольно эффективным на практике, тем более, если вы можете работать напрямую с матрицами (преобразованиями), которые будут управлять этими методами.

Вот простой способ, как вы можете повернуть актера в libgdx.

Во-первых, вам нужно установить источник:

 img.setorigin(width/2,hieght/2); 

Теперь вы можете вращать по часовой стрелке и против часовой стрелки в соответствии с вашими потребностями:

 img.rotate(2f); 

или

 img.rotate(-2f); 

Самый простой и короткий путь, который я нашел для установки источника, – вызвать:

 Actor a; ... a.setOrigin(Align.center);