Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вращение объекта по центру (http://www.flasher.ru/forum/showthread.php?t=212280)

KiL33 14.01.2016 10:41

Вращение объекта по центру
 
Вложений: 1
В примере, если зажать мышь и потянуть, создается прямоугольная форма, при нажатии на кнопку, форма делает поворот. Вращается она из точки 0,0. Нужно, чтобы форма вращалась по центру. А в идеале пивот вращения может находиться в произвольном месте.

test.swf   (24.7 Кб)


Код AS3:

import flash.events.MouseEvent;
import flash.display.Sprite;
import flash.text.TextField;
import com.greensock.TweenMax;
 
stage.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
var obj:Sprite;
 
var btn:Sprite = simpleButton();
addChild(btn);
btn.addEventListener(MouseEvent.CLICK, initRotate);
btn.x = (stage.stageWidth/2) - (btn.width/2);
btn.y = 200;
 
function initRotate(e:MouseEvent):void {
 
        if(obj != null) TweenMax.to(obj, 1, {rotation:90});
}
 
function onDown(e:MouseEvent):void {
        if(e.target is Sprite) return;
 
        obj = new Sprite();
        addChild(obj)
        obj.x = mouseX;
        obj.y = mouseY;
 
        stage.addEventListener(MouseEvent.MOUSE_UP, onUp);
        stage.addEventListener(MouseEvent.MOUSE_MOVE, onMove);
 
}
 
 
function onMove(e:MouseEvent):void {
 
        obj.graphics.clear();
        obj.graphics.beginFill(0x0);
        obj.graphics.drawRect(0, 0, obj.mouseX, obj.mouseY);
 
}
 
function onUp(e:MouseEvent):void {
 
        stage.removeEventListener(MouseEvent.MOUSE_UP, onUp);
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMove);
 
}
 
 
function simpleButton():Sprite {
 
        var sp:Sprite = new Sprite();
        sp.buttonMode = true;
        sp.graphics.beginFill(0xCCCCCC);
        sp.graphics.drawRect(0,0,100,20);
        sp.graphics.endFill();
        var txt:TextField = new TextField();
        sp.addChild(txt);
        txt.mouseEnabled = false;
        txt.text = "ROTATE";
        txt.autoSize = "left"
        txt.x = (sp.width/2) - (txt.width/2);
        return sp;
}


illuzor 14.01.2016 11:03

Нужно положить объект в контейнер и сдвинуть координаты на минус половину длины и ширины.
Вращать контейнер.

KiL33 14.01.2016 13:38

Т.е. при отпускании мыши сдвигать созданный объект, который внутри контейнера?
Тогда приходится такой мазохизм делать

Код AS3:

obj.x = -obj.width/2
obj.y = -obj.height/2
 
cont.x = cont.x+(obj.width/2);
cont.y = cont.y+(obj.height/2);

Чтобы при сдвиге объекта он не смещался, приходится в обратную сторону смещать сам контейнер. Как то не очень. Может я не так понял?

illuzor 14.01.2016 13:52

Всё так.
Ещё вариант - задействовать матрицу

Wolsh 14.01.2016 13:59

http://flasher.ru/forum/showpost.php...1&postcount=18

alatar 14.01.2016 15:10

http://www.flasher.ru/forum/blog.php?b=704

KiL33 14.01.2016 17:33

alatar, круто. Но у меня вся анимация c использованием твинов, как в таком случае использовать подход с матрицей, не знаю.

alatar 14.01.2016 17:54

твинеру всё равно что анимировать вы можете передать ему любую функцию, которая будет принимать "анимируемое" значение.

KiL33 15.01.2016 09:00

Так то оно так.
Не могу понять, как применить ваш метод.

Я делаю

Код AS3:

var m:Matrix = mc.transform.matrix;
var mtx:Matrix = rotateAroundTo(m, new Point(координаты пивота), new Point(координаты объекта));
 
TweenMax.to(mc, 1, {x:mtx.tx, y:mtx.ty, rotation:90});

Не?)

Объект улетает в сторону.

alatar 17.01.2016 13:39

Координаты, передаваемые в функцию должены быть в локальных координатах объекта, который необходимо повернуть. Углы, если используются, должны быть в радианах.
А дальше, например так.
Код AS3:

TweenPlugin.activate([TransformMatrixPlugin]);
...
var targetMatrix:Matrix = rotateAroundTo(mc.transform.matrix, mc.globalToLocal(pivot), mc.globalToLocal(координаты куда необходимо повернуться))ж
 
TweenMax.to(mc, 1, {transformMatrix:targetMatrix})



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

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