![]() |
|
||||||||||
|
|||||
|
[+4 06.05.14]
|
Есть контейнер, в нем постоянно находится только 1 чайлд - картинка. Картинка постоянно позиционируется по центру контейнера, когда с ней производят какие нибудь манипуляции. Есть задача, нужно по нажатию кнопки поворачивать эту саму картинку на += 90 градусов.
Вопрос такой, можно ли как то воспользоваться матрицами или еще чем, чтобы свернуть точку кручения в центр, тогда бы вопросов не было. Покажите пожалуйста пример, если можно. П.с. конструкция должна остаться такой КОнетйнер - внутри крутимая картинка. Координаты контейнера и применение к нему матриц недопустимо. Тоесть работать можно только с 1 чайлд-картинкой. И да пока не забыл, после применения кручения, нужно вернуть координату x и y в левый верхний угол соотв. Если матрицами воспользоваться сложно, или просто не получится в данной задаче, можно обойтись формулами, подстаривать координаты после поворота сразу в зависимости от ширины и высоты, создавая иллюзию кручения через центр. Поскольку с формулами у меня тоже проблемы, если кто делал - покажите пожалуйста пример. Спасибо |
|
|||||
|
Lorem ipsum
|
Матрицами это делается в три хода: сдвинул > повернул > поставил на место
__________________
Поймай яблоко 2! |
|
|||||
|
Да
http://help.adobe.com/en_US/FlashPla...ansformer.html методы rotateAroundExternalPoint rotateAroundInternalPoint Добавлено через 4 минуты Поставить конейтер на начало его элементов можно при помощи getRect или getBounds и соответственно localToGlobal методов дисплэйобжекта
__________________
... |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
package ru.wolsh.display.utils { import flash.display.DisplayObject; /* * * * * * * * * * * * * @author wolsh * * * * v. 21.10.2010 * * * \* * * * * * * * * */ public function centerRotate (object:DisplayObject, angle:Number) : void { var rad:Number = Math.PI / 180; // return object to default var currentAngle:Number = object.rotation * rad; object.rotation = 0; var oX:Number = object.width / 2; var oY:Number = object.height / 2; var oS:Number = Math.sin(currentAngle); var oC:Number = 1 - Math.cos(currentAngle); object.x -= oX * oC + oY * oS; object.y -= oY * oC - oX * oS; // rotate object var r:Number = angle * rad; var s:Number = Math.sin(r); var c:Number = 1 - Math.cos(r); object.rotation = angle; object.x += oX * c + oY * s; object.y += oY * c - oX * s; } }
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 21.03.2011 в 23:47. |
|
|||||
|
[+4 06.05.14]
|
Wolsh спасибо большое. буду разбираться
Добавлено через 44 минуты Wolsh что то косячит немного, или я не верно делаю При первом повороте нормально, при втором уже нет, а при третьем вообще улетает неясно куда Добавлено через 2 часа 9 минут Решено. Вот аналог вашего класса private var _startPoint:Point = new Point(0,0); public static function set externalPoint(p:Point) { _startPoint = p; // если крутим по центру передаем суда половину ширины и высоты } public static function rotateUserPoint (obj:DisplayObject , angle:int):void { obj.transform.matrix = new Matrix(); var mat:Matrix = obj.transform.matrix; MatrixTransformer.rotateAroundInternalPoint(mat, _startPoint.x, _startPoint.y, angle); obj.transform.matrix = mat; } |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
А, блин) Не с того проекта дернул класс, сорри. Там не было возврата в дефолт, это было в отдельном методе)).
Исправил код наверху на универсальный. Ну или, если нравятся матрицы, используйте их. По Вашему коду - зачем статический метод для установки точки? Не лучше ли передавать точку в метод поворота, ведь она индивидуальна для каждого объекта, который Вы будете вращать? И почему set externalPoint(), если вращение методом rotateAroundInternalPoint() ? "Чтоб никто не догадался"?
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 21.03.2011 в 23:54. |
|
|||||
|
[+4 06.05.14]
|
Wolsh ага чтоб никто не догадался)) Вопрос такой раз уж начал я делать все матрицами, как вернуть изначальную матрицу? Тоесть была матрица (1,0,0,1,100,100) допустим и угол был 0 градусов . Теперь я хочу повернуть объект на 90 градусов при этом после поворота сделать так, что бы матрица на объекте была такой, что поворот = 0, х и y координата = верхней левой точке?. Спасибо
|
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
х и y координата всегда в верхней левой точке, выражаясь вашим языком.
То есть чтобы изменилось положение НАЧАЛА системы координат внутри спрайта относительно его содержимого (я правильно понял о чем речь?) надо переместить это содержимое в новые координаты. В случае детишек все решаемо математикой, но если это собственная графика спрайта (нарисованная в нем Графиксом), ее только перерисовывать.
__________________
Reality.getBounds(this); |
|
|||||
|
[+4 06.05.14]
|
Wolsh я поясню. Вот был объект ( не нарисованный , а битмап) и стоял в 100-100. Я его повернул на 90 градусов. проверяю координаты пишет что x и y находятся теперь в правом верхнем углу, и это логично ведь прошел поворот и объект сменил матрицу. Вот я и спрашиваю как сделать, чтобы поворот прошел, но х и у снова находились в левом верхнем углу. Спасибо
|
![]() |
![]() |
Часовой пояс GMT +4, время: 10:59. |
|
|
« Предыдущая тема | Следующая тема » |
|
|