本教程着重于代码的编写,版本AS 3.0。只要制作一个旋转的3D球,图形元件的制作不作讲解,请参看有关教程。
include "Math2.as" //图片容器 var menu:Sprite=new Sprite(); //使图标移动 menu.x = 300; menu.y = 200; //注册事件侦听器 menu.addEventListener(Event.ENTER_FRAME,moveMenu); this.addChild(menu); //椭圆在x 和y 轴上的截距 var disx:Number = 200; var disy:Number = 10; //旋转速度 var speed:Number = 0; initMenu(5); function initMenu(n:int) { for (var i:int; i<n; i++) { var mc:MovieClip = new IconMenu(); //缩小图标 mc.scaleX = mc.scaleY = .5; menu.addChild(mc); } } //事件侦听器函数 function moveMenu(e:Event):void { //获取图标数 var iconCount:int = menu.numChildren; //定义数组 var depthArray:Array = new Array(); //把360度平分 var angle:Number = 360 / iconCount; for (var z:int; z<iconCount; z++) { //根据深度获取图标 var mc:MovieClip = menu.getChildAt(z); //跳转到不同帧,来显示不同的图标 mc.gotoAndStop(z+1); //设置图标的位置 mc.x = cosD(speed + angle*z) * disx; mc.y = sinD(speed + angle*z) * disy; setProp(mc,"alpha"); setProp(mc,"scaleX",.2,.7); setProp(mc,"scaleY",.2,.7); //保存图标到数组 depthArray[z] = mc; } //重新设置图标的深度 arrange(depthArray); speed += 2; } function arrange(depthArray:Array):void { //按照y坐标排序 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; } |
5、新建.as文档,保存名为:Math2.as (这个文档是进行三角函数的计算)
//角度转弧度 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)); } |
把fla文档与Math2.as 文档保存在同一目录下,进行测试。
讨论: http://www.missyuan.com/viewthread.php?tid=417566