显示代码
1 package {
2 import flash.display.Sprite;
3 import flash.events.Event;
4 import flash.geom.Point;
5
6 public class MouseAvoider extends Sprite {
7
8 private const SPRING:Number=0.1;//弹性系数
9 private const FRICTION:Number=0.9;//摩擦系数
10 private const FEAR_DISTANCE:Number=150;//安全距离(小于该距离则发生躲避行为)
11 private const MAX_AVOID_FORCE:uint=10;//最大躲避速度
12
13 private var _destinationPoint:Point;//目标静止点(鼠标远离该物体时,物体最终会静止的坐标点)
14 private var _speed:Point=new Point(0,0);//速度矢量(_speed.x即相当于vx,_speed.y即相当于vy)
15
16 public function MouseAvoider():void {
17 drawStuff();
18 }
19
20 private function drawStuff():void {
21 //默认先画一个半径为10的圆
22 graphics.beginFill(Math.random() * 0xFFFFFF);
23 //graphics.beginFill(0xFFFFFF);
24 graphics.drawCircle(0, 0, 5);
25 graphics.endFill();
26 }
27
28 //只写属性(设置目标点)
29 public function set destinationPoint(value:Point):void {
30 _destinationPoint=value;
31 addEventListener(Event.ENTER_FRAME, enterFrameHandler);
32 }
33
34
35 protected function enterFrameHandler(e:Event):void {
36 moveToDestination();//先移动到目标点
37 avoidMouse();//躲避鼠标
38 applyFriction();//应用摩擦力
39 updatePosition();//更新位置
40 }
41
42 //以弹性运动方式移动到目标点
43 private function moveToDestination():void {
44 _speed.x += (_destinationPoint.x - x) * SPRING;
45 _speed.y += (_destinationPoint.y - y) * SPRING;
46 }
47
48 //躲避鼠标
49 private function avoidMouse():void {
50 var currentPosition:Point=new Point(x,y);//确定当前位置
51 var mousePosition:Point=new Point(stage.mouseX,stage.mouseY);//确实鼠标位置
52 var distance:uint=Point.distance(currentPosition,mousePosition);//计算鼠标与当前位置的距离
53
54 //如果低于安全距离
55 if (distance<FEAR_DISTANCE) {
56 var force:Number = (1 - distance / FEAR_DISTANCE) * MAX_AVOID_FORCE;//计算(每单位时间的)躲避距离--即躲避速率
57 var gamma:Number=Math.atan2(currentPosition.y- mousePosition.y,currentPosition.x- mousePosition.x);//计算鼠标所在位置与当前位置所成的夹角
58
59 var avoidVector:Point=Point.polar(force,gamma);//将极坐标转换为普通(笛卡尔)坐标--其实相当于vx = force*Math.cos(gamma),vy = force*Math.sin(gamma)
60
61 //加速 躲避逃开
62 _speed.x+=avoidVector.x;
63 _speed.y+=avoidVector.y;
64 }
65 }
66
67 //应用摩擦力
68 private function applyFriction():void {
69
70 _speed.x*=FRICTION;
71 _speed.y*=FRICTION;
72 }
73
74 //最终更新自身的位置
75 private function updatePosition():void {
76
77 x+=_speed.x;
78 y+=_speed.y;
79 }
80
81 }
82 }
2 import flash.display.Sprite;
3 import flash.events.Event;
4 import flash.geom.Point;
5
6 public class MouseAvoider extends Sprite {
7
8 private const SPRING:Number=0.1;//弹性系数
9 private const FRICTION:Number=0.9;//摩擦系数
10 private const FEAR_DISTANCE:Number=150;//安全距离(小于该距离则发生躲避行为)
11 private const MAX_AVOID_FORCE:uint=10;//最大躲避速度
12
13 private var _destinationPoint:Point;//目标静止点(鼠标远离该物体时,物体最终会静止的坐标点)
14 private var _speed:Point=new Point(0,0);//速度矢量(_speed.x即相当于vx,_speed.y即相当于vy)
15
16 public function MouseAvoider():void {
17 drawStuff();
18 }
19
20 private function drawStuff():void {
21 //默认先画一个半径为10的圆
22 graphics.beginFill(Math.random() * 0xFFFFFF);
23 //graphics.beginFill(0xFFFFFF);
24 graphics.drawCircle(0, 0, 5);
25 graphics.endFill();
26 }
27
28 //只写属性(设置目标点)
29 public function set destinationPoint(value:Point):void {
30 _destinationPoint=value;
31 addEventListener(Event.ENTER_FRAME, enterFrameHandler);
32 }
33
34
35 protected function enterFrameHandler(e:Event):void {
36 moveToDestination();//先移动到目标点
37 avoidMouse();//躲避鼠标
38 applyFriction();//应用摩擦力
39 updatePosition();//更新位置
40 }
41
42 //以弹性运动方式移动到目标点
43 private function moveToDestination():void {
44 _speed.x += (_destinationPoint.x - x) * SPRING;
45 _speed.y += (_destinationPoint.y - y) * SPRING;
46 }
47
48 //躲避鼠标
49 private function avoidMouse():void {
50 var currentPosition:Point=new Point(x,y);//确定当前位置
51 var mousePosition:Point=new Point(stage.mouseX,stage.mouseY);//确实鼠标位置
52 var distance:uint=Point.distance(currentPosition,mousePosition);//计算鼠标与当前位置的距离
53
54 //如果低于安全距离
55 if (distance<FEAR_DISTANCE) {
56 var force:Number = (1 - distance / FEAR_DISTANCE) * MAX_AVOID_FORCE;//计算(每单位时间的)躲避距离--即躲避速率
57 var gamma:Number=Math.atan2(currentPosition.y- mousePosition.y,currentPosition.x- mousePosition.x);//计算鼠标所在位置与当前位置所成的夹角
58
59 var avoidVector:Point=Point.polar(force,gamma);//将极坐标转换为普通(笛卡尔)坐标--其实相当于vx = force*Math.cos(gamma),vy = force*Math.sin(gamma)
60
61 //加速 躲避逃开
62 _speed.x+=avoidVector.x;
63 _speed.y+=avoidVector.y;
64 }
65 }
66
67 //应用摩擦力
68 private function applyFriction():void {
69
70 _speed.x*=FRICTION;
71 _speed.y*=FRICTION;
72 }
73
74 //最终更新自身的位置
75 private function updatePosition():void {
76
77 x+=_speed.x;
78 y+=_speed.y;
79 }
80
81 }
82 }