package { import animation.trigonometry.ArrowByLoad; import flash.display.Sprite; import flash.events.Event; /** * @author Maliu */ [SWF(frameRate = 30)] //这里的元数据标签要Flex SDK才支持,Flash IDE不支持 public class EaseToMouse extends Sprite { private var arrow:ArrowByLoad; //鼠标跟随的元件,外部载入 private var easing:Number = 0.5; //缓动值,决定跟随速度的快慢,可自己尝试修改该值以观察效果 private var vx:Number = 0; //x轴速度 private var vy:Number = 0; //y轴速度 private var angle:Number; //角度,由dy与dx得到 private var dx:Number; //目标与当前元件的x轴距离 private var dy:Number; //目标与当前元件的y轴距离 private var arrowArray : Array; //储存跟随对象的数组 private const numArrow:Number = 10; //跟随对象的数目 private const scaleValue:Number = 0.86; //基础缩放值 public function EaseToMouse() { init(); } //初始化 private function init():void { arrowArray = new Array(); for(var i:int = 0; i 0) { calEvery(arrowArray[i-1].x, arrowArray[i-1].y, arrowArray[i]); } else { calEvery(mouseX, mouseY, arrowArray[i]); } } } //计算传入currentArrow的rotation,需要传入dx和dy private function calRotation(currentArrow:ArrowByLoad, dx:Number, dy:Number):void { angle = Math.atan2(dy, dx); currentArrow.rotation = angle * 180/Math.PI; } //计算每个元件的缓动,传入不同的目标值和缓动对象 private function calEvery(targetX:Number, targetY:Number, currentArrow:ArrowByLoad):void { dx = targetX - currentArrow.x; dy = targetY - currentArrow.y; if(Math.abs(dx)<1 && Math.abs(dy)<1) { vx = 0; vy = 0; //currentArrow.x = targetX; //currentArrow.y = targetY; } else { vx = dx * easing; vy = dy * easing; calRotation(currentArrow, dx, dy); //currentArrow.x += vx; //currentArrow.y += vy; } currentArrow.x += vx; currentArrow.y += vy; } //给每个元件赋予不同的缩放值和透明度 private function setScale(e:Event):void { var n:Number = this.numChildren; var tempScale:Number = 0; var temp:ArrowByLoad; for(var i:int = 0; i