Форум 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=128138)

Baec 31.07.2009 13:37

Программное изменение точки привязки
 
Пофильтровал инет - ничего хорошего на эту тему не нашел. Нашел только как это делалось в АС 2.0 - жуть. Какие-то двойные контейнеры и тд. Может можно как-то проще в АС3.0 ?

Если конкретней то программно создаем контейнер под картинку, грузим туда картинку и хотим ее крутить ротейтом, но крутим пока относительно левого верхнего угла. А хотелось бы относительно центра.

FlashRabbit 31.07.2009 13:42

В контейнере картинку по центру нужно выставить. Тут уже кучу тем таких было...

Baec 31.07.2009 13:49

Спасибо за содержательный ответ. И все же
Картинка адекватно грузится и адекватно отображается. Что значит "В контейнере картинку по центру нужно выставить"? Хоть намекните, ато я тоже могу сказать что проблема тривиальная, но она ж то от этого не решится!

dimarik 31.07.2009 14:03

Картинку центруйте относительно контейнера - Loader'а в который Вы загружаете картинку. Крутите его content.

Baec 31.07.2009 14:05

Хм. Ссори наверное за невежество, но ЧЕМ ее центрировать?!

dimarik 31.07.2009 14:11

Код AS3:

var image:DisplayObject = this.loader.content;
image.x -= image.width / 2;
image.y -= image.height / 2;
image.rotation = 90;


Baec 31.07.2009 14:30

Ага, наверное я просто неверно задал вопрос.
Я хочу крутить картинку относительно ее же центра. А не относительно левого верхнего угла картинки и центра контейнера.

Другими словами мне нужно сдвинуть точку привязки программно.

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

udaaff 31.07.2009 14:36

Никак.

Baec 31.07.2009 14:38

Не очень обнадеживает, но спасибо.

dimarik 31.07.2009 14:39

Тогда Вам придется смещать "точку привязки" в зависимости от угла поворота. Геометрия синусов и косинусов.

marat_sa 31.07.2009 15:22

В TweenLite такое расширение было - точку выставляешь и крутишь/изменяешь размер объекта относительно нее... твинами того же TweenLite :D

Mur4ik 01.08.2009 02:13

marat_sa, только плагины именно эти платные, т.е доступны только членам клуба.

рабочее решение примерно такое:
Код AS3:

// функция поворота на угол в градусах относительно точки,
// находящейся в пределах отображаемого объекта
function rotateAroundPoint(doInstance:DisplayObject, angleDegrees:Number, ptRotationPoint:Point):void
{
        var m:Matrix = doInstance.transform.matrix;
 
        ptRotationPoint = m.transformPoint(ptRotationPoint);
 
        m.tx -= ptRotationPoint.x;
        m.ty -= ptRotationPoint.y;
        m.rotate( angleDegrees * (Math.PI / 180) );
        m.tx += ptRotationPoint.x;
        m.ty += ptRotationPoint.y;
        doInstance.transform.matrix = m;
}
 
// аналогичная функция, только для масштабирования отностительно точки,
// лежащей внутри отображаемого объекта
function scaleFromPoint(doInstance:DisplayObject, sx:Number, sy:Number, ptScalePoint:Point):void
{
        var m:Matrix = doInstance.transform.matrix;
 
        ptScalePoint = m.transformPoint(ptScalePoint);
 
        m.tx -= ptScalePoint.x;
        m.ty -= ptScalePoint.y;
        m.scale(sx, sy);
        m.tx += ptScalePoint.x;
        m.ty += ptScalePoint.y;
 
        doInstance.transform.matrix = m;
}
 
// задаем "точку регистраци" в центре someDisplayObject
var centerPoint:Point = new Point(someDisplayObject.width * .5, someDisplayObject.height * .5);
 
// поворачиваем someDisplayObject на 45 градусов относительно центра
rotateAroundPoint(someDisplayObject, 45, centerPoint);
// увеличиваем масштаб someDisplayObject в 2 раза относительно центра
scaleFromPoint(someDisplayObject, 2, 2, centerPoint);


DEAFFF 03.08.2009 13:22

да только матрицей и можно такое сотворить, вообще с помощью матрицы можно избавиться от произвольного количества контейнеров

AQUAFRESH 08.09.2009 20:57

функция rotateAroundPoint работает так как мне как раз нада ... только вот немогу понять как обнулять матрицу вращения при вызове функции... ну тоесть.

мне нада эту функцию вызывать в enterframe. когда я указываю 45 градусов например оно вращаеться бесконечно по кругу.... а мне нада только 1 раз.

Hidest 08.09.2009 21:04

Так это не точка привязки (локальное начало координат объекта), а центр трансформации... Насколько помню, он существует только в Flash IDE для трансформирования ручками...

Alex Lexcuk 08.09.2009 22:11

>>только вот немогу понять как обнулять матрицу вращения

а чего в хелп не смотрим? там ж написано для обнуления матрицы использутся метод
identity

AQUAFRESH 08.09.2009 22:23

та это не то, я имеюю ввиду просто если я написал
rotateAroundPoint(someDisplayObject, 45, centerPoint);
то даже если эту функцию я вызову 100 раз то что бы
someDisplayObject.rotation был 45 ...
а не 45 90 135 180 и тд в цикле

Alex Lexcuk 09.09.2009 00:07

Код AS3:

package eee 
{
        import flash.display.*;
        import flash.geom.*;
        import flash.utils.*;
        import flash.events.*;
 
        public class NewClass extends MovieClip
        {
                private var trans:Transform;
                private var myMatrix:Matrix = new Matrix;
                private var fig:Object;
                private var bm:Bitmap;
                private var i:int;
                private var sX:int;
                private var sY:int;
                public function NewClass()
                {
                        bm = new Bitmap(new BMD_Start(0, 0));
                        addChild(bm);
                        trans = new Transform(bm);
                        sX = bm.width/2;
                        sY = bm.height/2;
                        addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                }
 
                private function enterFrameHandler(evt:Event):void {
                        i++; if (i > 360) i = 0;
                        setTransform(100, 100, i, sX, sY);
                }
 
                public function setTransform(_x:int, _y:int, _ang:int, centrX:int=20, centrY:int=40):void {
                        myMatrix.identity();
                        myMatrix.tx -= centrX;
                        myMatrix.ty -= centrY;
                        myMatrix.rotate( _ang * Math.PI/180 );
                        myMatrix.tx += _x;
                        myMatrix.ty += _y;
                        trans.matrix = myMatrix;
                }
        }
 
}

Ну вот относительно своего центра крутится картинка.

AQUAFRESH 09.09.2009 01:26

ооо так правильоно теперь пашет...

но блин теперь немогу wsad кнопками картинку перемещать,
потому что его матрица идентити становиться... (((

Mur4ik 09.09.2009 02:14

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

А вообще я не понимаю зачем в ENTER_FRAME постоянно лишние расчеты, если нужно один раз повернуть объект на 45 градусов.

AQUAFRESH 09.09.2009 11:46

ок щас буду думать ...


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

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