已经持续一个星期没有更新Blog了,最近的生活多被一些琐碎的事情给塞满了!研究AS3的程序也有一段时间了,感觉每天都进步了一点点。今天编写了个很实用也是很常用的导航菜单效果,供AS程序新手参考,顺便为自己的blog提升下人气值:)
首先新建一个影片剪辑,链接名为"IconMenu",然后往影片剪辑中导入5张图片即可。
程序运用到的一些常用的物理学公式:
radians = degrees*Math.PI/180;弧度转为度;
degree = radians*180/Math.PI;度转为弧度
创建椭圆:
function onEnterFrame(e:Event){
xposition = centerX+Math.cos(angle)*radius;
yposition = centerY+Math.sin(angle)*radius;
angle+=speed;
}
程序中的难点为深度排序,在AS2一般是通过坐标判断设置深度,  AS3是通过Y轴或者Z轴进行排序的,排序程序如下:
var depthArray:Array=new Array();
function arrange(depthArray:Array):void {
 depthArray.sortOn("y", Array.NUMERIC);
 var i:int=depthArray.length;
 while (i--) {
  menu.setChildIndex(depthArray[i], i);
 }
}

整段程序源代码如下:
var disx:Number=250;//旋转x轴半径
var disy:Number=30;//旋转y轴半径
var speed:Number=0;//加速度
var endAngle:Number=90;
var tempAngle:Number=0;
var isRotating:Boolean=true;
var menu:Sprite=new Sprite();
menu.x=260;//旋转中心点x坐标
menu.y=50;//旋转中心点y坐标
menu.addEventListener(Event.ENTER_FRAME,moveMenu);
this.addChild(menu);

initMenu(5);
function initMenu(n:int) {
 for (var i:int; i<n; i++) {
  var mc:MovieClip=new IconMenu();
  mc.buttonMode = true;
  mc.scaleX=mc.scaleY=1;
  mc.addEventListener(MouseEvent.MOUSE_DOWN,startRotation);
  menu.addChild(mc);
 }
}
function initAngle(b:Boolean) {
 if (isRotating) {
  tempAngle+=speed;
 }
 speed=0;
 isRotating=b;
}
function startRotation(e:MouseEvent):void {
 var currentIcon:MovieClip=e.target as MovieClip;
 endAngle=atan2D(currentIcon.y,cosD(currentIcon.angle)*disy);
 endAngle=(endAngle>-180&&endAngle<-90)?-270-endAngle:90-endAngle;
 initAngle(true);
 menu.addEventListener(Event.ENTER_FRAME,moveMenu);
}
//排列位置
function moveMenu(e:Event):void {
 var iconCount:int=menu.numChildren;
 var depthArray:Array=new Array();
 var angle:Number=360/iconCount;
 for (var z:int; z<iconCount; z++) {
  var mc:MovieClip=menu.getChildAt(z) as MovieClip;
  mc.gotoAndStop(z+1);
  mc.angle=tempAngle+speed+angle*z;
  mc.x=cosD(mc.angle)*disx;
  mc.y=sinD(mc.angle)*disy;
  depthArray[z]=mc;
  setProp(mc,"alpha",.3,1);
  setProp(mc,"scaleX",.4,1);
  setProp(mc,"scaleY",.4,1);
 }
 arrange(depthArray);
 speed+=(endAngle-speed)*.2;
 if (Math.abs(speed-endAngle)<1) {
  menu.removeEventListener(Event.ENTER_FRAME,moveMenu);
  initAngle(false);
 }
}
//mc深度管理对Y 轴进行排序
function arrange(depthArray:Array):void {
 depthArray.sortOn("y", Array.NUMERIC);
 var i:int=depthArray.length;
 while (i--) {
  menu.setChildIndex(depthArray[i], i);
 }
}

function setProp(mc:MovieClip,prop:String,n1:Number=.5, n2:Number=1):void {
 mc[prop]=((mc.y+2*disy)/disy-1)/2*(n2-n1)+n1;
}
function angleToRadian(angle:Number):Number {
 return angle*(Math.PI/180);
}
function radianToAngle(radian:Number):Number {
 return radian*(180/Math.PI);
}
function sinD(angle:Number):Number {
 return Math.sin(angleToRadian(angle));
}
function cosD(angle:Number):Number {
 return Math.cos(angleToRadian(angle));
}
function atan2D(y:Number, x:Number):Number {
 return radianToAngle(Math.atan2(y, x));
}
 


 

  1. 这个能不能做到不触摸就不定时的自动滚动》???
    Token 于 2010-6-11 15:26:32 回复
    可以啊~加多个函数~

    回复

  1. 效果非常棒,很流畅....

    回复

我内心激动,有话要说