利用MatrixTransformer类来改变对象的旋转点
显示对象的rotation属性是围绕着注册点来旋转的,而默认的注册点是(0,0),所以要让对象绕着一个设定的点旋转,比如绕着其中心点旋转,就要用到Matrix类和MatrixTransformer类。
MatrixTransformer类有两个函数:rotateAroundInternalPoint()和rotateAroundExternalPoint()
rotateAroundInternalPoint(),围绕矩阵转换空间中定义的点旋转矩阵。 此功能可以用于将影片剪辑围绕其内部的变形点进行旋转。
rotateAroundExternalPoint(),围绕矩阵转换空间以外定义的点旋转矩阵。 此功能可以用于将影片剪辑围绕其父级中的变形点进行旋转。
package { import fl.motion.MatrixTransformer; import flash.display.Sprite; import flash.display.Bitmap; import flash.display.BitmapData; import flash.text.TextField; import flash.text.TextFormat; import flash.text.TextFormatAlign; import flash.geom.Point; import flash.geom.Matrix; import flash.events.Event; import flash.display.Graphics; public class test extends Sprite { private var container:Sprite;//容器 private var rect:Sprite;//显示对象 private var rectCenter:Point;//中心点 private var rectMatrix:Matrix;//显示对象的Matrix private var curRectAng:Number=0;//旋转角度 public function test() { container=new Sprite(); addChild(container); container.x=200; container.y=100; //关于rect的旋转所操作的都是容器container rect=new Sprite(); rect.graphics.beginFill(0xCCCCCC); rect.graphics.drawRect(0,0,50,70); rect.graphics.endFill(); rectCenter=new Point(rect.width/2,rect.height/2); rect.graphics.beginFill(0x007700); /** 将中心点作为旋转点,此点属于显示对象rect内部定义的点, 如果用rotateAroundExternalPoint(),就要定义在显示对象的外部 */ rect.graphics.drawCircle(rectCenter.x,rectCenter.y,5); rect.graphics.endFill(); container.addChild(rect); rectMatrix=container.transform.matrix.clone(); addEventListener(Event.ENTER_FRAME,onEnter); } private function onEnter(event:Event) { curRectAng=(curRectAng-2)%360; rotateRect(curRectAng); } private function rotateRect(deg:Number):void { var mat:Matrix=rectMatrix.clone(); MatrixTransformer.rotateAroundInternalPoint(mat,rectCenter.x,rectCenter.y,deg); //MatrixTransformer.rotateAroundExternalPoint(mat,rectCenter.x,rectCenter.y,deg); container.transform.matrix=mat; } } }