forked from: forked from: study

by bradsedito
♥0 | Line 80 | Modified 2011-02-04 15:00:07 | MIT License
play

ActionScript3 source code

/**
 * Copyright bradsedito ( http://wonderfl.net/user/bradsedito )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/6RDt
 */

// forked from ashtail's forked from: study
// forked from ashtail's study
/*
* clockmakerさんのコードを映しながら勉強
*/
package {
    import flash.events.Event;
    import flash.display.*;
    import flash.display.Sprite;
    import flash.net.URLRequest;
    import flash.system.Security;
    import flash.utils.getTimer;
    import org.papervision3d.view.BasicView;
    import org.papervision3d.materials.WireframeMaterial;
    import org.papervision3d.objects.primitives.*;
    import flash.geom.Matrix;
    import org.papervision3d.objects.special.ParticleField;
    import org.papervision3d.materials.special.ParticleMaterial;

    
    public class Main extends BasicView {
        
        // Plane(material:MaterialObject3D = null, width:Number = 0, height:Number = 0, segmentsW:Number = 0, segmentsH:Number = 0)
        private var earth:Plane = new Plane(new WireframeMaterial(0xFFFFFF, 0.1), 5000, 5000, 6, 6);
        private var _loader:Loader = new Loader();
        private var _player:Object = new Object();
        
        public function Main() {
            Security.allowDomain("www.youtube.com");
            _loader.contentLoaderInfo.addEventListener(Event.INIT, _loadInitHandler);
            _loader.load(new URLRequest("http://www.youtube.com/apiplayer?version=3"));
                        
            
            // BasicViewクラスはカメラやViewPortといった,描画でかならず必要となるクラスをまとめて宣言してくれる。
            // (viewportWidth:Number = 640, viewportHeight:Number = 480, scaleToStage:Boolean = true, interactive:Boolean = false, cameraType:String = "Target")
            super(465, 465, false);
            stage.quality = StageQuality.LOW;
            
            // 背景
            var w:int=465;
            var h:int=465;
            
            //線状のグラデーション
            var type:String = GradientType.LINEAR;
            var colors:Array=[0x666666,0x000000];
            var alphas:Array=[1, 1];
            var ratios:Array=[0,255];
            var mtrx:Matrix = new Matrix();
            mtrx.createGradientBox(w,h,0,0,0);
            //グラデーションを45度回転する
            mtrx.rotate(Math.PI/2);
            var spread:String=SpreadMethod.PAD;
            var interpolation:String="rgb";
            var focalPointRatio:Number=0;
            //グラデーションで塗る
            graphics.beginGradientFill(type,colors,alphas,ratios,mtrx,spread,interpolation,focalPointRatio);
            //四角形を描く
            graphics.drawRect(0,0,w,h);
            graphics.endFill();
            
            
            // 3Dのパーツを配置
            earth.y = -1000;
            earth.rotationX = 90;
            earth.rotationY = 45;
            scene.addChild(earth);
            
            // パーティクルを生成します(彗星)
            // ParticleMaterial(color:Number, alpha:Number, shape:int = 0)
            var particleMat:ParticleMaterial = new ParticleMaterial(0xFFFFFF, 1);
            
            // ParticleField クラスは指定された 3D 領域上にランダムに沢山のパーティクルを描写するクラスです。
            // ParticleField(mat:ParticleMaterial, quantity:int = 200, particleSize:Number = 4, fieldWidth:Number = 2000, fieldHeight:Number = 2000, fieldDepth:Number = 2000)
            var particles:ParticleField = new ParticleField(particleMat, 500, 4, 5000, 3000, 5000)
            scene.addChild( particles );

            
            // エンターフレームイベントの登録
            addEventListener(Event.ENTER_FRAME, _enterFrameHandler2);
            
        }
        
        private function _loadInitHandler(e:Event):void{
                addChild(_loader);
                _loader.content.addEventListener("onReady", _playerReadyHandler);
        }
        
        private function _playerReadyHandler(e:Event):void{
                _player = _loader.content;
                _player.setSize(320,240);
                _player.loadVideoById("PiU5LbQf80w", 0, "small");
        }


        
        
        private var rot:Number = 0 // 角度
        
        private function _enterFrameHandler(e:Event):void{
            var time:Number = getTimer();
            
            
            // カメラが演習を回っているように設定しています
            camera.x = 2000 * Math.sin(time / 3000);
            camera.y = 800 * Math.sin(time / 2000);
            camera.z = 2000 * Math.cos(time / 3000);
            // カメラが近づいたり離れたりする演出
            camera.zoom = 15 * Math.sin(time / 4000) + 40;
            
    
            
            //PV3Dのレンダリング
            singleRender();
        }
        
        /*
        フレーム毎に衛星の配置角度を0.5度ずつ加算し、
        それをカメラの座標に変換しています。
        カメラの座標は三角関数(sinとcos)を使って、角度から求めています。
        1000という値は円の半径です。
        */
        private function _enterFrameHandler2(e:Event):void{
            
            
            rot += 0.5 // 毎フレーム角度を0.5度ずつ足していく

            // 角度に応じてカメラの位置を設定
            camera.x = 1000 * Math.sin(rot * Math.PI / 180)
            camera.z = 1000 * Math.cos(rot * Math.PI / 180)


    
            
            //PV3Dのレンダリング
            singleRender();
        }
        
        private function _enterFrameHandler3(e:Event):void{
            
            
            // マウスの位置に応じて角度を設定
            // マウスのX座標がステージの幅の何%の位置にあるか調べてそれを360度で乗算する
            var targetRot:Number = ( mouseX / stage.stageWidth ) * 360

            // イージングの公式を用いて滑らかにする
            // 値 += (目標値 - 現在の値) * 減速値
            rot += (targetRot - rot) * 0.02;
            

            // 角度に応じてカメラの位置を設定
            camera.x = 1000 * Math.sin(rot * Math.PI / 180)
            camera.z = 1000 * Math.cos(rot * Math.PI / 180)
    
            
            //PV3Dのレンダリング
            singleRender();
        }

        
    }
}