Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   поворот картинки по 90 градусам (http://www.flasher.ru/forum/showthread.php?t=152684)

in4core 21.03.2011 14:55

поворот картинки по 90 градусам
 
Есть контейнер, в нем постоянно находится только 1 чайлд - картинка. Картинка постоянно позиционируется по центру контейнера, когда с ней производят какие нибудь манипуляции. Есть задача, нужно по нажатию кнопки поворачивать эту саму картинку на += 90 градусов.

Вопрос такой, можно ли как то воспользоваться матрицами или еще чем, чтобы свернуть точку кручения в центр, тогда бы вопросов не было. Покажите пожалуйста пример, если можно. П.с. конструкция должна остаться такой КОнетйнер - внутри крутимая картинка. Координаты контейнера и применение к нему матриц недопустимо. Тоесть работать можно только с 1 чайлд-картинкой. И да пока не забыл, после применения кручения, нужно вернуть координату x и y в левый верхний угол соотв.

Если матрицами воспользоваться сложно, или просто не получится в данной задаче, можно обойтись формулами, подстаривать координаты после поворота сразу в зависимости от ширины и высоты, создавая иллюзию кручения через центр. Поскольку с формулами у меня тоже проблемы, если кто делал - покажите пожалуйста пример. Спасибо

Zebestov 21.03.2011 15:17

Матрицами это делается в три хода: сдвинул > повернул > поставил на место

Александр Мостовой 21.03.2011 15:23

Да

http://help.adobe.com/en_US/FlashPla...ansformer.html

методы
rotateAroundExternalPoint
rotateAroundInternalPoint

Добавлено через 4 минуты
Поставить конейтер на начало его элементов можно при помощи getRect или getBounds и соответственно localToGlobal методов дисплэйобжекта

in4core 21.03.2011 16:32

@Александр Мостовой

А можете показать примерчик поворотов?

Допустим контейнер есть _cont , а картинка внутри _image . А то мне несовсем понятно как должны работать методы rotateAround...*

Wolsh 21.03.2011 16:42

Код AS3:

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;
    }
 
}


in4core 21.03.2011 16:59

Wolsh спасибо большое. буду разбираться

Добавлено через 44 минуты
Wolsh что то косячит немного, или я не верно делаю

Код AS3:

function click(e:Event) {
 
centerRotate ( sprite , n )
 
n += 90
 
}

При первом повороте нормально, при втором уже нет, а при третьем вообще улетает неясно куда

Добавлено через 2 часа 9 минут
Решено. Вот аналог вашего класса
Код AS3:

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;
 
                }

Пример
Код AS3:

var n:int = 0;
RotationClass.externalPoint = new Point(sprite.width/2, sprite.height/2);
sprite.addEventListener(Event.ENTER_FRAME , go)
 
function go(e:Event) {
    RotationClass.rotateUserPoint ( e.currentTarget , n )
    n += 2;
}


Wolsh 21.03.2011 23:46

А, блин) Не с того проекта дернул класс, сорри. Там не было возврата в дефолт, это было в отдельном методе)).
Исправил код наверху на универсальный. Ну или, если нравятся матрицы, используйте их.

По Вашему коду - зачем статический метод для установки точки? Не лучше ли передавать точку в метод поворота, ведь она индивидуальна для каждого объекта, который Вы будете вращать? И почему set externalPoint(), если вращение методом rotateAroundInternalPoint() ? "Чтоб никто не догадался"?

in4core 21.03.2011 23:59

Wolsh ага чтоб никто не догадался)) Вопрос такой раз уж начал я делать все матрицами, как вернуть изначальную матрицу? Тоесть была матрица (1,0,0,1,100,100) допустим и угол был 0 градусов . Теперь я хочу повернуть объект на 90 градусов при этом после поворота сделать так, что бы матрица на объекте была такой, что поворот = 0, х и y координата = верхней левой точке?. Спасибо

Wolsh 22.03.2011 00:06

х и y координата всегда в верхней левой точке, выражаясь вашим языком.
То есть чтобы изменилось положение НАЧАЛА системы координат внутри спрайта относительно его содержимого (я правильно понял о чем речь?) надо переместить это содержимое в новые координаты. В случае детишек все решаемо математикой, но если это собственная графика спрайта (нарисованная в нем Графиксом), ее только перерисовывать.

in4core 22.03.2011 00:10

Wolsh я поясню. Вот был объект ( не нарисованный , а битмап) и стоял в 100-100. Я его повернул на 90 градусов. проверяю координаты пишет что x и y находятся теперь в правом верхнем углу, и это логично ведь прошел поворот и объект сменил матрицу. Вот я и спрашиваю как сделать, чтобы поворот прошел, но х и у снова находились в левом верхнем углу. Спасибо


Часовой пояс GMT +4, время: 13:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.