In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

flash on 2011-8-25

greensock
flash  
pv3d
Get Adobe Flash player
by leebig1982 29 Aug 2011

    Talk

    leebig1982 at 29 Aug 2011 07:56
    2011/08/29 更新Code加入TweenLite的easing,使用Expo.easeIn並且把動作秒數從0.5調整到2,可明顯看出效果。另更改按下指定的方塊時翻轉角度的判斷,讓選定的方塊有360的翻轉效果。
    Embed
/**
 * Copyright leebig1982 ( http://wonderfl.net/user/leebig1982 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/zIe9
 */

package {
    import flash.text.TextField;
    //greensock
    import com.greensock.TweenLite;
    import com.greensock.easing.*;
    // flash  
    import flash.events.Event;
    import flash.events.MouseEvent;

    // pv3d
    import org.papervision3d.view.BasicView;
    import org.papervision3d.materials.WireframeMaterial;
    import org.papervision3d.materials.ColorMaterial;
    import org.papervision3d.materials.utils.MaterialsList;
    import org.papervision3d.objects.primitives.Cube;
    import org.papervision3d.view.layer.ViewportLayer;
    
    public class test3D_Cube extends BasicView {
       //中央點的xyz  
        private var centerX:Number = 0;
        private var centerY:Number = 0;
        private var centerZ:Number = 0;
        //半徑
        private var radius:Number = 500;
        //物件數量
        private var itemOfNumber:Number = 6;
        //每個物件分配的弧度
        private var angleUnit:Number = Math.PI * 2 / itemOfNumber;
        // 方體模型陣列
        private var CubeModArr:Array;
        //方塊模型Layer 名稱陣列
        private var CubeLayerArr:Array;
        //目前選定的方塊
        private var nowIndex:int = 0;


        // 建構子
        public function test3D_Cube()
        {
            // 建置3D環境
            init3D();
            //監聽closeBtn
            var closeText:TextField = new TextField();
                closeText.text = 'Close';      
            this.stage.addChild(closeText);
            closeText.addEventListener(MouseEvent.CLICK , clickCloseBtn);
            
        }
            
        // 建置3D環境
        private function init3D():void
        {
            // 建立模型(方體)
            // 參數1:材質列表
            // 參數2:方體寬度
            // 參數3:方體深度
            // 參數4:方體高度
            // 參數5:寬度分隔節數
            // 參數6:深度分隔節數
            // 參數7:高度分隔節數 
            CubeModArr = new Array;
            CubeLayerArr = new Array;
            
            for ( var i:int = 0 ; i < itemOfNumber ; i ++  ) {
                // 建立材質列表
                var CubeMatList:MaterialsList = new MaterialsList(); 

                // 將方體六面材質加入材質列表                
                CubeMatList.addMaterial( new ColorMaterial( Math.random() * 0xffffff ), "front"  ); 
                CubeMatList.addMaterial( new ColorMaterial( Math.random() * 0xffffff ), "back"   ); 
                CubeMatList.addMaterial( new ColorMaterial( 0x000000 ), "left"   ); 
                CubeMatList.addMaterial( new ColorMaterial( 0x000000 ), "right"  ); 
                CubeMatList.addMaterial( new ColorMaterial( 0x000000 ), "top"    ); 
                CubeMatList.addMaterial( new ColorMaterial( 0x000000 ), "bottom" ); 
                

                CubeModArr[i] = new Cube( CubeMatList, 200, 20, 400, 5, 5, 1);
                //建立可點選的圖層 並設定名稱
                CubeLayerArr[i] = CubeModArr[i].createViewportLayer(this.viewport, false);    
                CubeLayerArr[i].name = String(i);    
                CubeLayerArr[i].addEventListener(MouseEvent.CLICK , clickHandel);
                
                // 將模型加入3D場景中            
                this.scene.addChild(CubeModArr[i]);            
            }
            //設定位置
            setCubePosision();
            // 開始渲染
            this.startRendering();
        }

        //設定位置
        private function setCubePosision():void {
            var i:int;
            var tmpAdd:int = 0;        
            for ( i = nowIndex ; i <  itemOfNumber ; i ++ ) {
                //設定方塊新座標
                setCubeXY( CubeModArr[i] , tmpAdd );
                tmpAdd ++;
            }
            
            if ( nowIndex > 0 ) {
                for ( i = 0 ; i <  nowIndex ; i ++ ) {                    
                    //設定方塊新座標
                    setCubeXY( CubeModArr[i] , tmpAdd );
                    tmpAdd ++;
                }
            }
            
        }
        //設定方塊新座標
        private function setCubeXY( inCube:Cube , add:int ):void {
            var addAngle:Number = angleUnit * add ;
            //算出弧度            
            var angle:Number = Math.PI - addAngle;    
              
                        
            //新的x跟z
            var newX:Number = centerX + Math.sin(angle) * radius; 
            var newZ:Number = centerZ + Math.cos(angle) * radius; 
            //算出Y軸翻轉的角度           
            var Yrel:Number = addAngle * 180 / Math.PI;
            if ( Yrel == 0) {    
                Yrel = 180;
                /*
                //判斷原始角度 如果>0 表示按了右邊
                if ( inCube.rotationY >= 0 ) {
                    Yrel = 180;
                }else {
                    Yrel = -180;    
                }
                */
            }else {
                if( Yrel >= 180){
                    Yrel = Yrel - 360;
                }
            }
                      
            //用tween動畫把方塊移過去
            TweenLite.to(inCube, 1, {x:newX, z:newZ , rotationY:Yrel , ease:Expo.easeIn});
        }
        //滑鼠click
        private function clickHandel(evt:MouseEvent):void {
            if ( nowIndex == int(evt.target.name)) {//如果案了目前選的 進行動畫放大
                doTweenMovie();
            }else{        
                //設定目前選的方塊int
                nowIndex = int(evt.target.name);
                //移動方塊位置
                setCubePosision();
            }
        }
        
        //進行方塊翻轉 以及放大
        private function doTweenMovie():void {
            var tmpCube:Cube = CubeModArr[nowIndex] ;            
            //第一段動畫結束
            var tmpFunA:Function = function ():void {
                trace('第一段動畫結束');
                tmpFunB();
            };    
            var tmpFunB:Function = function ():void {
                //第2段動畫
                TweenLite.to( tmpCube, 1, { z:-1000 , rotationX:0 , rotationY:180 , rotationZ:0 });    
            };
            
            //第一段動畫
            TweenLite.to( tmpCube, 0.5, { scaleX:1.2, scaleY:1.2,scaleZ:1.2, rotationX:70 , rotationY:20 , rotationZ:100 ,onComplete:tmpFunA });
        }
        
        //按下closeBtn        
        private function clickCloseBtn( evt:MouseEvent):void {
            var tmpCube:Cube = CubeModArr[nowIndex] ;            
            //第一段動畫結束
            var tmpFunA:Function = function ():void {
                trace('第一段動畫結束');
                tmpFunB();
            };    
            var tmpFunB:Function = function ():void {
                //第2段動畫
                TweenLite.to( tmpCube, 0.5, { scaleX:1, scaleY:1, scaleZ:1, rotationX:0 , rotationY:0 , rotationZ:0 ,onComplete:setCubePosision} );
            };
            
            //第一段動畫
            TweenLite.to( tmpCube, 0.7, { z:-600 ,rotationX:-50 , rotationY:100 , rotationZ:-30 ,onComplete:tmpFunA });
        }
    }
}