2008/11/23 | 导航台航向角、向台、背台示例
类别(Flash与飞行程序设计) | 评论(2) | 阅读(863) | 发表于 00:35

  应朋友之约整理了一下运动效果的代码,做了一个导航台与飞机航向关系示例,重点是代码结构设计,图中,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很长一段时间了,现在终于和自己的本专业产生了一点联系,真是高兴啊。

2

评论Comments