已经持续一个星期没有更新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));
}

回复