Класс вращения объекта вокруг произвольной точки
Спасибо выражается Wolsh за направление.
package com.in4core.transformation { import fl.motion.MatrixTransformer; import flash.display.DisplayObject; import flash.geom.Matrix; import flash.geom.Point; /** * $(c)2011 * * @author in4core * * About : * * RotationPoint is a static class for rotation DisplayObject around freePoint. * For define internal Point use RotationPoint.internalPoint property. * For define internal Matrix use RotationPoint.internalMatrix property. * For begin rotation use RotationPoint.rotateAroundPoint method. * * ... * version 1.0 */ public class RotationPoint { private static var _defaultPoint:Point = new Point(0, 0); private static var _defaultMatrix:Matrix = new Matrix(); private static var _localMatrix:Matrix = new Matrix(); public static function set internalPoint ( p : Point ):void { _defaultPoint = p; } public static function set internalMatrix ( m : Matrix ) : void { _defaultMatrix = m; } public static function rotateAroundPoint ( disObj : DisplayObject , angle : Number ):void { disObj.transform.matrix = _defaultMatrix; _localMatrix = disObj.transform.matrix; MatrixTransformer.rotateAroundInternalPoint ( _localMatrix , _defaultPoint.x, _defaultPoint.y , angle ); disObj.transform.matrix = _localMatrix; } private static const VERSION = 1.0; } }
если точка вращения не меняется достаточно задать ее 1 раз. Если структура объекта не меняется ( ширина , высота, скейл...) матрицу задаем тоже только единожды, иначе матрицу нужно перезадавать.
Всего комментариев 55
Комментарии
21.03.2011 23:04 | |
21.03.2011 23:25 | |
Кстати чтобы не создавать тему узнаю здесь : после поворота меняются координаты x и y нашего объекта а так же угол поворота соотв. Как можно вернуть ему дефолтную матрицу, тоесть сделать так - чтобы объект не поменял свои координаты , а так же не изменил угол поворота, но при этом остался как повернутый ?
|
|
Обновил(-а) in4core 21.03.2011 в 23:43
|
22.03.2011 00:08 | |
Цитата:
не изменил угол поворота, но при этом остался как повернутый
|
22.03.2011 00:12 | |
Цитата:
Нужно не меняя угол поворота как бы повернуть объект
|
22.03.2011 00:22 | |
Кэп негодует, очевидно же, что никак =)
|
22.03.2011 08:44 | |
в AS ветке уже все объяснили..меняем матрицу - меняются и x c y. по-другому никак.не хочешь трогать x/y - крути внутренности.
|
23.03.2011 00:53 | |
in4core а зачем целый класс? О_о
private function transformObject($obj:Sprite, $scale:Number, $angle:Number, $relativeToObjectSize:Point, $relativeToObjectXY:Point):void { var mtx:Matrix = new Matrix() mtx.tx = -$relativeToObjectSize.x; mtx.ty = -$relativeToObjectSize.y; mtx.rotate($angle * Math.PI / 180); mtx.scale($scale, $scale); mtx.translate($relativeToObjectSize.x, $relativeToObjectSize.y) mtx.translate($relativeToObjectXY.x - $relativeToObjectSize.x, $relativeToObjectXY.y - $relativeToObjectSize.y); $obj.transform.matrix = mtx; } Цитата:
вращаем \ скейлим обьект относительно какой то точки.
$relativeToObjectSize - точка внутри обьекта относительно которой будет применяться трансформация $relativeToObjectXY - точка в контейнере обьекта относительно которой будет применяться трансформация З.Ы. тю, какой класс, у вас там целый пакет гляжу выделен! |
|
Обновил(-а) nOobCrafter 23.03.2011 в 01:09
|
23.03.2011 01:08 | |
23.03.2011 02:00 | |
Цитата:
я к тому что просто статик метода хватило бы...)
var sp:Sprite = new Sprite(x,y,z,...getBounds....and so on) . Имхо |
|
Обновил(-а) in4core 23.03.2011 в 02:02
|
23.03.2011 15:31 | |
Цитата:
com — это коммерческие организации
Ну и, если серьезно, то __рекомендуется__ так называть пакеты. Это не правило и, тем более, не аксиома |
23.03.2011 16:38 | |
Пакеты это имя "сайта" наоборот =)
То есть не com.flasher, а ru.flasher. com — домен для коммерческих организаций, собственно. |
23.03.2011 16:54 | |
Psycho Tiger, ну а если у человека нету еще сайта, а в будущем планируется?)
|
23.03.2011 17:07 | |
incvizitor, а так бывает? )
|
23.03.2011 17:34 | |
Цитата:
Пакеты это имя "сайта" наоборот
|
23.03.2011 19:02 | |
Я кладу в ru.k0t0vich, но сайта k0t0vich.ru не существует в природе.
|
23.03.2011 20:21 | |
Psycho Tiger, ребёнок опять напился и несёт оффтоповую ерунду?)
|
23.03.2011 21:35 | |
Это Вы у ребёнка спросите.
|
23.03.2011 23:38 | |
Как бы не так
Цитата:
* RotationPoint is a static class for rotating
|
23.03.2011 23:39 | |
Psycho Tiger, какое отношение имеет namespace в откомпилированной программе к сайту?
|
24.03.2011 00:47 | |
Я объяснил выше, что выразился неточно. И namespace это немного другое.
|
24.03.2011 13:23 | |
Цитата:
incvizitor, а так бывает? )
|
24.03.2011 14:38 | |
Цитата:
Докажете противоположное?
|
24.03.2011 14:47 | |
Zebestov
А как-же Евреи ? |
24.03.2011 15:22 | |
Цитата:
А как-же Евреи ?
|
24.03.2011 15:58 | |
i.o., ты слишком серьезен
Но оффтоп пора прекратить, согласен. |
24.03.2011 16:15 | |
Цитата:
i.o., ты слишком серьезен
Обычно после таких шуточных заявлений и начинается плевание друг в дружку продуктом дефекации. |
24.03.2011 19:00 | |
iNils, за изречение i.o. или за выяснений национальных особенностей?
|
24.03.2011 19:04 | |
Очевидно за "Разжигание межнациональной розни".
|
25.03.2011 03:17 | |
Psycho Tiger
http://ru.wikipedia.org/wiki/.com .com — общий домен верхнего уровня для коммерческих организаций (сейчас используется без ограничений). |
25.03.2011 10:23 | |
andrew911, я где-то говорил что нельзя делать пакет com?)
|
25.03.2011 12:53 | |
лично я отказался делать пакет com, лиш по одной причине: много полезных фреймворков в которых корневой пакет com. Использовать фреймворки в одном проекте становиться затруднительно.
|
31.03.2011 15:22 | |
Когда в посте обсуждать особо нечего, начинается обгладывание его костей.
|
21.04.2011 16:53 | |
21.04.2011 17:08 | |
коориднаты по x и y объекта
|
21.04.2011 17:37 | |
Но в таком случае получается вращение объекта не вокруг произвольной точки, а вокруг точки регистрации. Так? В чем тогда смысл?
|
21.04.2011 18:22 | |
Вот пример кода:
package { import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; import flash.events.TimerEvent; import flash.geom.Matrix; import flash.utils.Timer; import fl.motion.MatrixTransformer; public class MatrixExample extends Sprite { private var _t:Timer = new Timer(20, 0); private var _pX:Number; private var _pY:Number; public function MatrixExample() { super(); this.addEventListener(Event.ADDED_TO_STAGE, init) } private function init(e:Event):void { removeEventListener(Event.ADDED_TO_STAGE, init); _pX = sim1.width / 2; _pY = sim1.height / 2; _t.addEventListener(TimerEvent.TIMER, initTransform); _t.start(); } private function initTransform(e:TimerEvent):void { sim1.transform.matrix = MatrixRotate(); } private function MatrixRotate():Matrix { var matr:Matrix = sim1.transform.matrix; MatrixTransformer.rotateAroundInternalPoint(matr, _pX, _pY, 15); return matr; } } } Что здесь происходит. Полупрозрачный квадрат, мувик, вращается с помощью включенной опции rotate в ИДЕ. Непрозрачный квадрат вращается с помощью приведённого кода. Начинают вращение находясь по одним и тем же координатам, причем полупрозрачный мувик - копия непрозрачного (то есть полностью идеинтичен). Через некоторое время после начала вращения (10-15 сек.) становится заметно смещение непрозрачного к нулевым координатам. Что конечно не есть хорошо. Может я что то упускаю? Не так делаю? |
|
Обновил(-а) fish_r 21.04.2011 в 23:15
|
21.04.2011 22:52 | |
вот здесь нашёл ответ: http://www.flasher.ru/forum/showpost...85&postcount=2
|
21.04.2011 23:42 | |
Цитата:
GBee а что здесь ry,rx?
|
22.04.2011 00:12 | |
Собственно вот
Белый квадратик - изначальное положение вращаемого квадратика. Красный кружок - точка вращения, по клику меняется. Исходник Все в ЕнтерФрейме происходит. |
|
Обновил(-а) GBee 22.04.2011 в 00:15
|
22.04.2011 00:13 | |
Я так понял что не "вокруг произвольной точки", а около точки принадлежащей области объекта, верно?
|
Последние записи от in4core
- Система диалогов, создаем подобие old School типа Fallout. (07.05.2014)
- MVC в игорной индустрии (27.11.2012)
- Якорь мне .... ))) Или History API (06.11.2012)
- FSD - учим php/sql (28.06.2012)
- I4Logger - простой и компактный логгер (06.05.2012)