package {
import flash.display.*;
public class Moving {
//将一个mc对象指向另一个target,参数omega是角速度
public static function pointTo(mc:MovieClip,target:MovieClip,omega:Number=0) {
var dx:Number=mc.x-target.x;
var dy:Number=mc.y-target.y;
//与X轴的夹角
//因为取到的是弧度,所以后面加了 *180/Math.PI 来转换成角度。
var angle:Number=(270+Math.atan2(dy,dx)*180/Math.PI)%360;
//mc的最大旋转角度
var crtangle:Number=(angle-mc.rotation+360)%360;
//判读mc的旋转方向
var dir:int=crtangle<=180?1:-1;
if (omega) {
mc.rotation=(crtangle<180&&crtangle>omega||crtangle>180&&360-crtangle>omega)?(mc.rotation+omega*dir):angle;
} else {
mc.rotation=angle;
}
}
//将mc沿着竖直方向运动,运动速度为vspeed
public static function moveDirectly(mc:MovieClip,vspeed:Number) {
mc.y+=vspeed;
}
//将mc沿着某一方向运动,运动速度为speed
public static function moveBeeline(mc:MovieClip,speed:Number,angle:Number) {
if (angle!=0) {
mc.rotation=- angle;
mc.x+=speed*Math.sin(angle/180*Math.PI);
mc.y+=speed*Math.cos(angle/180*Math.PI);
} else {
mc.y+=speed;
}
}
//让mc跟踪另一个target
//mc速度为speed
//角速度omega
//dir用来表示mc是趋向目标(1),还是远离目标(-1)
public static function Track(target:MovieClip,mc:MovieClip,speed:Number,omega:Number=0,dir:int=1) {
if (!target) {
Moving.moveDirectly(mc,dir*speed/2);
mc.rotation=dir>0?180:0;
} else {
var dx:Number=mc.x-target.x;
var dy:Number=mc.y-target.y;
//target与Y轴的夹角
var angle:Number=270+Math.atan2(dy,dx)*180/Math.PI%360;
//target与mc的夹角
var crtangle:Number=angle-mc.rotation+360%360;
//判断mc的旋转方向
var dir:int=crtangle<=180?1:-1;
if (omega) {
mc.rotation=crtangle<180&&crtangle>omega||crtangle>180&&360-crtangle>omega?mc.rotation+omega*dir:angle;
} else {
mc.rotation=angle;
}
mc.x+=speed*Math.sin(mc.rotation*Math.PI/180);
mc.y-=speed*Math.cos(mc.rotation*Math.PI/180);
}
}
//让一个mc对象斜着运动,
//开始斜向移动的位置为startSlanting
public static function moveSlanting(mc:MovieClip,vspeed:Number,hspeed:Number,startSlanting:Number) {
mc.y+=vspeed;
if (mc.y>startSlanting) {
mc.x+=hspeed;
}
}
//让一个mc螺旋运动
//螺旋中心运动速度为speed
//螺旋中心位置(centerx,centery);
//螺旋半径为radius
//旋转速度angle
public static function moveCircle(mc:MovieClip,speed:Number,radius:Number,angle:Number,centerx:Number,centery:Number):int {
mc.x=radius*Math.sin(angle*Math.PI/180)+centerx;
mc.y=radius*Math.cos(angle*Math.PI/180)+centery;
var an:Number=Math.abs(angle%360);
if (an<60||an>300) {
return 1;
} else if (an>120&&an<240) {
return -1;
} else {
return 0;
}
}
}
}