本教程著重於程式碼的編寫,版本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
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
//根據深度獲取圖示
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 文件儲存在同一目錄下,進行測試。