Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Set transformation point программно (http://www.flasher.ru/forum/showthread.php?t=148340)

alatar 28.12.2010 18:55

Цитата:

это решилобы часть вопросов.
Ага, так же как поиск по форуму. :)

Dukobpa3 28.12.2010 18:56

Присоединюсь к вопросу автора.

alatar, просто с матрицами, да не просто:)
К примеру я с успехом применяю матрицу для смещений всяких. Вращение тоже работает ок - пматрицей ноль клипа передвинул и ок.

А вот со скейлами полдня промучался и ничего не получилось. Скейл при любых раскладах работал из лево-верха клипа, а не из нуля оного. (хотя такое же смещение нуля помогало мне когда надо было крутить клип вокруг этого самого нуля).

passertm 28.12.2010 19:24

Цитата:

Сообщение от alatar (Сообщение 960543)
Ага, так же как поиск по форуму. :)

ну. согласитесь, поиск это не faq. очень часто бывают темы которые то ли не знаешь как искать. то ли поиск выдает кучу тем не относяшихся к делу

alatar 29.12.2010 01:05

Цитата:

А вот со скейлами полдня промучался и ничего не получилось.
Просто надо учесть, что линейные размеры при увеличении меняются и скорректировать координаты.

Код AS3:

package
{
        import flash.display.DisplayObject;
        import flash.display.Graphics;
        import flash.display.Loader;
        import flash.display.Sprite;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.events.MouseEvent;
        import flash.geom.Matrix;
        import flash.geom.Point;
        import flash.net.URLRequest;
        import flash.system.System;
 
        public class asTest extends Sprite
        {
                private var _sprite:Sprite = new Sprite();
 
                public function asTest()
                {
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.align = StageAlign.TOP_LEFT;
 
                        draw(_sprite.graphics);
 
                        _sprite.x = 100;
                        _sprite.y = 100;
 
                        addChild(_sprite);
                        _sprite.addEventListener(MouseEvent.CLICK, scaleAroundPoint);
                }
 
                private function draw(gr:Graphics):void
                {
                        gr.beginFill(Math.random()*0xFFFFFF);
                        gr.drawRect(0, 0, 50, 50);
                        gr.endFill();
                }
 
                private var scale:Number = 2;
 
                private function scaleAroundPoint(event:MouseEvent):void
                {
                        scale++;
 
                        var target:DisplayObject = DisplayObject(event.currentTarget);
 
                        //точка вращения
                        var transformPoint:Point = new Point(25, 25);
 
                        var unscaledWidth:Number = target.width / target.scaleX;
                        var unscaledHeight:Number = target.height / target.scaleY;
 
                        var offsetX:Number = transformPoint.x / unscaledWidth;
                        var offsetY:Number = transformPoint.y / unscaledHeight;
 
                        /* корректируем координаты объекта.
                        Необходимо восстановить координаты объекта относитльно
                        точки вращения без увеличения */

                        var targetX:Number = target.x + target.width * offsetX - target.width * offsetX / target.scaleX;
                        var targetY:Number = target.y + target.height * offsetY - target.height * offsetY / target.scaleY;
 
                        var m:Matrix = new Matrix();
 
                        m.translate(-transformPoint.x, -transformPoint.y);
                        m.scale(scale, scale);
                        m.translate(transformPoint.x, transformPoint.y);
                        m.translate(targetX, targetY);
 
                        target.transform.matrix = m;
                }
        }
}


Dukobpa3 29.12.2010 01:12

Спасибо Кэп, я именно так и сделал:)

Вопрос не про "подогнать по пикселам после скейла", а в том что если делать это в ИДЕ - то смена центра влияет и на центр скейла.
Кодом у меня это сделать не получилось, кроме как подогнать так как ты привел в своем примере.

alatar 29.12.2010 01:15

FlashIDE просто сдвигает содержимое в контейнере относительно 0,0. Что значит не получилось кодом?

Dukobpa3 29.12.2010 01:24

Не получилось - значит при любых раскладах скейлится из лево-верха - вправо-низ.
И кроме как центровать в процессе - ниче не придумалось.

Хотя я так полагал что скейл работает из точки нуля мувика (черненький крестик в ИДЕ). И вот знатоки вопрос:
- Это я неправильно думаю про скейл и он при любых раскладах таки работает из лево-верха, и пофиг где ноль
- или я прав насчет скейла, но все танцы с матрицей на самом деле делают что-то другое, но не сдвигают ноль
- или я просто что-то не так делал, и скейл у нас должен быть из точки нуля, и матрица должна свигать именно этот ноль.

Wolsh 29.12.2010 01:41

Длина стороны прямоугольника зависит от того, где находится начало координат?

alatar 29.12.2010 01:43

Все трансформации работают относительно 0,0 клипа (включая скейл и матрицу).
Матрица сдвигает объект, а не его 0,0.

Dukobpa3 29.12.2010 02:24

А не все ли равно, сдвинуть ноль относительно объекта (что и звучит то абсурдно), или сдвинуть объект относительно нуля?

В итоге этих действий мы получим(ну это как я себе понимаю) один результат - ноль будет в определенной точке клипа (не лево-верх клипа, но что-то другое).


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

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