应朋友之约整理了一下运动效果的代码,做了一个导航台与飞机航向关系示例,重点是代码结构设计,图中,NDB方位线指向电台,VOR方位线应该是背向电台的,图省事,先简单的处理了下。
如果结合 TweenMax 里的贝赛尔通路,就可以动态的指定飞行的轨迹,实现指定航线的功能,留着当以后的作业吧。CS4 里不晓得有没有把贝赛尔通路这种功能给收纳进去。目前至少是有这么个解决方案可供使用。
操作说明:点 左/右 转按钮,可以调整飞机的航向,暂停可以停止运动(speed = 0 ),导航台和飞机均可任意拖动,便于演示一些特殊位置的角度关系。
AS3 代码如下:
//飞行自主运动
aircraft_mc.heading = 180;//航向
var varAng:Number = aircraft_mc.heading -180;//角度修正
aircraft_mc.speed = 2;
aircraft_mc.navaids = new Array();//留待以后扩展
aircraft_mc.addEventListener( Event.ENTER_FRAME, fly );
function fly(evt:Event) {
var mc = evt.target;
mc.rotation = mc.heading - 90;
mc.x += mc.speed*Math.cos(mc.rotation*Math.PI/180);
mc.y += mc.speed*Math.sin(mc.rotation*Math.PI/180);
if (mc.x<0) {
mc.x = 550;
}
if (mc.x>550) {
mc.x = 0;
}
if (mc.y<0) {
mc.y = 400;
}
if (mc.y>400) {
mc.y = 0;
}
refreshACFT();
refreshADF();
}
//控制飞机方向
turnLeft_btn.addEventListener( MouseEvent.CLICK, onTurnLeft );
function onTurnLeft(evt:MouseEvent) {
aircraft_mc.heading -= 4;
varAng -= 4;
};
turnRight_btn.addEventListener( MouseEvent.CLICK, onTurnRight );
function onTurnRight(evt:MouseEvent) {
aircraft_mc.heading += 4;
varAng += 4;
};
//飞机的拖动
aircraft_mc.buttonMode = true;
aircraft_mc.addEventListener( MouseEvent.MOUSE_DOWN, onDragACFT );
function onDragACFT(evt:MouseEvent) {
evt.target.startDrag(); // 此句还是应该换成 aircraft_mc.startDrag(); 否则机头上的箭头就可能会被拖到一边去的。
stage.addEventListener( MouseEvent.MOUSE_UP, onStopDragACFT );
};
function onStopDragACFT(evt:MouseEvent) {
aircraft_mc.stopDrag();
stage.removeEventListener( MouseEvent.MOUSE_UP, onStopDragACFT );
};
//飞机暂停
var savSpeed = 0;
var isFlying = true;
pause_btn.addEventListener( MouseEvent.CLICK, onPause );
function onPause(evt:MouseEvent) {
if (isFlying) {
savSpeed = aircraft_mc.speed;
aircraft_mc.speed = 0;
isFlying = false;
evt.target.label = "继续";
} else {
trace( savSpeed );
aircraft_mc.speed = savSpeed;
isFlying = true;
evt.target.label = "暂停";
}
};
//导航台可拖动
NDB_mc.buttonMode = true;
VOR_mc.buttonMode = true;
NDB_mc.addEventListener( MouseEvent.MOUSE_DOWN, onStartDrag );
VOR_mc.addEventListener( MouseEvent.MOUSE_DOWN, onStartDrag );
function onStartDrag(evt:MouseEvent) {
evt.target.startDrag();
stage.addEventListener( MouseEvent.MOUSE_UP, onStopDrag );
};
function onStopDrag(evt:MouseEvent) {
evt.target.stopDrag();
stage.removeEventListener( MouseEvent.MOUSE_UP, onStopDrag );
};
//刷新飞机的航向线条
function refreshACFT() {
var a = Math.atan2(NDB_mc.y-aircraft_mc.y, NDB_mc.x-aircraft_mc.x)*180/Math.PI;
aircraft_mc.vectorMB.rotation = a-varAng;
var b = Math.atan2(VOR_mc.y-aircraft_mc.y, VOR_mc.x-aircraft_mc.x)*180/Math.PI;
aircraft_mc.vectorHeading.rotation = b-varAng;
}
function refreshADF(){};//刷新仪表显示,尚未实现此功能。
民用飞行用图中,垂直向上为磁北,也就是航向的0度位置,flash 坐标系中水平向右为0度位置,因此,在航向(heading)和飞机的rotation之间需要进行一个修正。在制作元件时,我的机头是指向右侧的,因此,上面代码中的角度修正关系也与这个设定有关。
varAng 代表了角度的修正关系。
学Flash很长一段时间了,现在终于和自己的本专业产生了一点联系,真是高兴啊。