Показать сообщение отдельно
Старый 07.12.2009, 17:50
Vit025 вне форума Посмотреть профиль Найти все сообщения от Vit025
  № 1  
Ответить с цитированием
Vit025

Регистрация: May 2004
Сообщений: 56
По умолчанию Масштабирование относительно поинта - почему смещается объект?

Доброго всем времени суток! Пытаюсь организовать масштабирование относительно центра через матрицу. Все хорошо, но объект смещается монемногу в сторону. В данном случае примерно 20 пихелей в лево в минуту Не подскажет ли кто-нибудь что у меня тут не так? Два дня уже убил :-(

Код AS3:
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();
		}
    }
}
Спасибо