![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: May 2004
Сообщений: 56
|
Доброго всем времени суток! Пытаюсь организовать масштабирование относительно центра через матрицу. Все хорошо, но объект смещается монемногу в сторону. В данном случае примерно 20 пихелей в лево в минуту
Не подскажет ли кто-нибудь что у меня тут не так? Два дня уже убил :-(package { import flash.display.BitmapData; import flash.display.Sprite; import flash.events.Event; import flash.geom.Matrix; import flash.geom.Point; import flash.geom.Rectangle; public class tester extends Sprite { private var test1:Sprite=new Sprite; private var test2:Sprite = new Sprite; public function tester():void { getRectangle(test1,0xFF0000); getRectangle(test2,0x00FF00); test1.x=50; test2.x=84; test1.y=test2.y=20; addChild(test1); addChild(test2); test2.addEventListener(Event.ENTER_FRAME,centerScale); test1.scaleX=test1.scaleY=1.1; } private var cs:Number=1; private var csplus:Number=0.1; private function centerScale(e:Event):void { var obj:Sprite = e.currentTarget as Sprite; if(cs>=2) { csplus=-.1; } if(cs<=0.2) { csplus=.1; } cs+=csplus; var point:Point=getRealCenter(obj); trace(point); var matr:Matrix = obj.transform.matrix; var position:Point = new Point(matr.tx,matr.ty); var scal:Point=new Point(matr.a,matr.d); matr.identity(); var center:Point = matr.deltaTransformPoint(point); matr.translate(-center.x,-center.y); matr.scale(cs,cs); matr.translate(center.x,center.y); obj.transform.matrix=matr; matr.identity(); obj.x=position.x-point.x*(cs-scal.x); obj.y=position.y-point.y*(cs-scal.y); } public function getRealCenter(target:Sprite):Point { var targetBounds:Rectangle = target.getBounds(target); var matr:Matrix = new Matrix; matr.translate(-targetBounds.x,-targetBounds.y); var data:BitmapData = new BitmapData(targetBounds.width,targetBounds.height,true,0x00000000); data.draw(target,matr); var colorBounds:Rectangle = data.getColorBoundsRect(0xFFFFFFFF, 0x00000000, false); var result:Point = new Point(colorBounds.x+colorBounds.width/2,colorBounds.y+colorBounds.height/2); return result.add(new Point(targetBounds.x,targetBounds.y)); } private function getRectangle(obj:Sprite,color:uint):void { obj.graphics.clear(); obj.graphics.beginFill(color,1); obj.graphics.drawRect(80,80,2,80); obj.graphics.endFill(); } } } |
|
|||||
|
Banned
[+4 25.09.09]
[+1 12.11.09] [+4 12.12.09] Регистрация: Sep 2009
Сообщений: 231
|
Происходит, видимо, из-за округления дробных чисел.. Ох вы себе и жизнь то усложнили в этом примере..
|
|
|||||
|
Регистрация: May 2004
Сообщений: 56
|
А можно подробнее в чем усложнил? Конечная задача вращать и масштабировать произвольный прозрачный пнг вокруг центра изображения...
Последний раз редактировалось Vit025; 07.12.2009 в 19:11. |
|
|||||
|
Banned
[+4 25.09.09]
[+1 12.11.09] [+4 12.12.09] Регистрация: Sep 2009
Сообщений: 231
|
вы вращаете спрайт. можно к примеру, при его создании расчитывать чтобы его центр был центром содержимого.
|
|
|||||
|
Регистрация: May 2004
Сообщений: 56
|
Мде... ну вот, собственно, и ответ. bicubic_bublic - низкий поклон :-)
Добавлено через 17 часов 56 минут Увы :-( номер не прошел. Если объект после установки не изменяется, то все в порядке, а если перемещается или, тем более, размножается, то я все равно возвращаюсь к своей схеме и нарываюсь на смещение. Все сводится к изменению Registration Pointа. Есть какие нибудь идеи? Спасибо |
|
|||||
|
Banned
[+4 25.09.09]
[+1 12.11.09] [+4 12.12.09] Регистрация: Sep 2009
Сообщений: 231
|
у вас анимированные картинки что ли?
или вы перемещаете картинку внутри контейнера? var bitmap:Bitmap = .... ; //картинка, которую нужно повращать var bitmapContainer:Sprite = new Sprite(); //собственно контейнер bitmapContainer.addChild(bitmap); bitmap.x = -bitmapCenterX; //совмещаем центр контейнера с центром картинки bitmap.y = -bitmapCenterY; .... bitmapContainer.rotation = 45; bitmapContainer.x = 100; bitmapContainer.y = 100; |
|
|||||
|
Регистрация: May 2004
Сообщений: 56
|
Цитата:
... |
|
|||||
|
Banned
[+4 25.09.09]
[+1 12.11.09] [+4 12.12.09] Регистрация: Sep 2009
Сообщений: 231
|
ну чтобы ошибка не накапливалась можно округлять координаты так называемого центра до какого-нибудь знака..
но скорее всего вы так просто не избавитесь от этой погрешности.. |
|
|||||
|
Регистрация: May 2004
Сообщений: 56
|
Цитата:
Добавлено через 38 минут Мде... похоже это Проблема... Попробовал MatrixTransformer (из fl.motion.MatrixTransformer)- тот же результат! Объект смещается! package { import flash.display.Sprite; import flash.events.Event; import flash.geom.Matrix; import flash.geom.Point; import fl.motion.MatrixTransformer; public class tester extends Sprite { private var test1:Sprite=new Sprite; private var test2:Sprite = new Sprite; public function tester():void { getRectangle(test1,0xFF0000); getRectangle(test2,0x00FF00); test1.x=50; test2.x=84; test1.y=test2.y=20; addChild(test1); addChild(test2); test2.addEventListener(Event.ENTER_FRAME,rotateByTransformMatrix); } private function rotateByTransformMatrix(e:Event):void { var obj:Sprite = e.currentTarget as Sprite; var matr:Matrix = obj.transform.matrix; MatrixTransformer.rotateAroundInternalPoint(matr,81,120,1); obj.transform.matrix=matr; } private function getRectangle(obj:Sprite,color:uint):void { obj.graphics.clear(); obj.graphics.beginFill(color,1); obj.graphics.drawRect(80,80,2,80); obj.graphics.endFill(); } } } Резюме: округлять надо ВСЕ. Хотя бы до сотых. |
![]() |
![]() |
Часовой пояс GMT +4, время: 17:20. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|