forked from: 2001年宇宙の旅的な

by smallflowergame forked from 2001年宇宙の旅的な (diff: 75)
=========音がでます注意してください=============

2001年宇宙の旅っぽくしてみたかったんです。
他に考えつかなかったのでwonderflの宣伝にしてみました。

音源は映画と同じカラヤン指揮ウィーン・フィル1959年。
演奏から50年経っているのでパブリック・ドメインだと思うのですが。
ダメだったらすぐ削除します
♥0 | Line 210 | Modified 2010-08-12 00:23:11 | MIT License
play

ActionScript3 source code

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

// forked from aomoriringo's 2001年宇宙の旅的な
/*

=========音がでます注意してください=============

2001年宇宙の旅っぽくしてみたかったんです。
他に考えつかなかったのでwonderflの宣伝にしてみました。

音源は映画と同じカラヤン指揮ウィーン・フィル1959年。
演奏から50年経っているのでパブリック・ドメインだと思うのですが。
ダメだったらすぐ削除します
*/

package
{
    import flash.display.BitmapData;
    import flash.display.BitmapDataChannel;
    import flash.display.BlendMode;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageQuality;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.filters.BlurFilter;
    import flash.filters.GlowFilter;
    import flash.geom.ColorTransform;
    import flash.media.Sound;
    import flash.media.SoundChannel;
    import flash.net.URLRequest;
    import flash.text.TextField;
    import flash.text.TextFormat;
    import flash.text.TextFormatAlign;
    
    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.core.effects.BitmapColorEffect;
    import org.papervision3d.core.effects.BitmapLayerEffect;
    import org.papervision3d.core.effects.utils.BitmapClearMode;
    import org.papervision3d.core.effects.utils.BitmapDrawCommand;
    import org.papervision3d.lights.PointLight3D;
    import org.papervision3d.materials.BitmapMaterial;
    import org.papervision3d.materials.ColorMaterial;
    import org.papervision3d.materials.shaders.PhongShader;
    import org.papervision3d.materials.shaders.ShadedMaterial;
    import org.papervision3d.objects.DisplayObject3D;
    import org.papervision3d.objects.primitives.Sphere;
    import org.papervision3d.render.BasicRenderEngine;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.view.Viewport3D;
    import org.papervision3d.view.layer.BitmapEffectLayer;

    [SWF(width=465, height=465, frameRate=30, backgroundColor=0x000000)]

    public class wonderfl0002_2001 extends Sprite
    {
        public static const CAMERA_DISTANCE:uint = 2000;

        private var camera:Camera3D;
        private var renderer:BasicRenderEngine;
        private var scene:Scene3D;
        private var viewport:Viewport3D;
        private var root3d:DisplayObject3D;
        
        private var earth:Sphere;
        private var bmdEarth:BitmapData;
        private var earthColor:Number = 1;        
        private var moon:Sphere;
        private var sun:Sphere;
        
        private var textFields:Array;
        private var sound:Sound;
        private var curtain:Sprite;
        private var sc:SoundChannel;
        
        public function wonderfl0002_2001()
        {
            addEventListener(Event.ADDED_TO_STAGE, initialize);
        }

        private function initialize(evt:Event):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, initialize);

            stage.align = StageAlign.TOP_LEFT;
            stage.quality = StageQuality.HIGH;
            stage.scaleMode = StageScaleMode.NO_SCALE;

            setupPV3D();

            createEarth();
            createMoon();
            createSun();            
            createTextField();
            createCurtain();

            // BGMの読み込み
            sound = new Sound();    
            sound.addEventListener(Event.COMPLETE, playSound);
            sound.load(new URLRequest("http://iplextra.u-aizu.ac.jp/matsu/aomoringo/2001.mp3"));
            
            
        }

        // BGMの再生
        private function playSound(e:Event):void{
            sound.removeEventListener(Event.COMPLETE, playSound);
            sc = sound.play();
            
            addEventListener(Event.ENTER_FRAME, step);            
        }

        private function setupPV3D():void
        {
            camera = new Camera3D();
            camera.zoom = 1.5;
            camera.focus = 200;
            camera.target = DisplayObject3D.ZERO;

            renderer = new BasicRenderEngine();
            scene = new Scene3D();
            viewport = new Viewport3D(465, 465, true);
            addChild(viewport);

            root3d = new DisplayObject3D();
            scene.addChild(root3d);
        }

        //地球(一番手前)
        private function createEarth():void
        {
            var light:PointLight3D = new PointLight3D();
            light.y = 50;
            light.z = -0.1;
            
            // 時間の遷移と共に暗くしていくために  bmdEarth はグローバルで宣言
            bmdEarth = new BitmapData(465, 465, true, 0);
            bmdEarth.perlinNoise(465/8, 465/8, 8, 10, true, true, BitmapDataChannel.BLUE);
            bmdEarth.colorTransform(bmdEarth.rect, new ColorTransform(0.4,0.4,1,1));
            
            var mat:BitmapMaterial = new BitmapMaterial(bmdEarth);
            var shader:PhongShader = new PhongShader(light, 0xffffff, 0x000000, 8);
            
            earth = new Sphere( new ShadedMaterial(mat, shader) , 750 , 32, 24);
            earth.y = -400;
            earth.useOwnContainer = true;
            earth.filters = [
                new GlowFilter(0x0000ff, .1, 32, 32, 2),
            ];
            earth.rotationX = 90;
            root3d.addChild(earth);
        }

        //月(真ん中)
        private function createMoon():void
        {
            var light:PointLight3D = new PointLight3D();

            light.y = 300;
            light.z = 310;
            var bmd:BitmapData = new BitmapData(465, 465, true, 0);
            bmd.perlinNoise(465/8, 465/8, 8, 10, true, true);
            
            var mat:BitmapMaterial = new BitmapMaterial(bmd);
            var shader:PhongShader = new PhongShader(light, 0xffffff, 0x000000, 10);
            
            moon = new Sphere( new ShadedMaterial(mat, shader), 350 , 32, 24);
            moon.z = 300;
            moon.useOwnContainer = true;
            moon.filters = [
                new GlowFilter(0xffffff, .1, 50, 50, 2),
            ];
            root3d.addChild(moon);
        }

        //太陽(一番奥)
        private function createSun():void
        {    
            var mat:ColorMaterial = new ColorMaterial(0xFFFFFF,1);
            
            var bfx:BitmapEffectLayer = new BitmapEffectLayer(viewport, stage.stageWidth, stage.stageHeight, true, 0, BitmapClearMode.CLEAR_PRE);
            bfx.addEffect(new BitmapLayerEffect(new BlurFilter(5, 5, 1)));
            //bfx.addEffect(new BitmapLayerEffect(new GlowFilter(0xFF0000, 1, 0.01, 0.01, 0.1)));
            bfx.addEffect(new BitmapColorEffect(0.99, 0.7, 0.7, 0.99));
            bfx.drawCommand=new BitmapDrawCommand(null, new ColorTransform(1, 0.5, 0.4, 0.45), BlendMode.ADD);
            bfx.drawLayer.blendMode=BlendMode.OVERLAY;
            viewport.containerSprite.addLayer(bfx);
            
            sun = new Sphere(mat, 100 ,32, 24);
            sun.z = 600;
            sun.y = 350;
           
           bfx.addDisplayObject3D(sun);
            
            sun.useOwnContainer = true;
            root3d.addChild(sun);
        }
        
        private function createTextField():void
        {
            var format:TextFormat = new TextFormat();
            format = new TextFormat("Microsoft Sans Serif", 20);
            format.align = TextFormatAlign.CENTER;
            format.color = 0xFFFFFF;
            
            textFields = new Array(5);
            var texts:Array = ["KAYAC Inc.","PRESENTS","A KAYAC PROJECT PRODUCTION","wonderfl", "build Flash online"];
            var textSize:Array = [20, 10, 20, 50, 20];
            var textY:Array = [300, 330, 300, 300, 355];
                        
            for(var i:int=0 ; i<5 ; i++){
                textFields[i] = new TextField();
                textFields[i].text = texts[i];
                textFields[i].visible = false;
                textFields[i].width = 465;
                textFields[i].y = textY[i];
                format.size = textSize[i];
                textFields[i].setTextFormat(format);
                this.addChild(textFields[i]);
            }
         }
        
        private function createCurtain():void{
            curtain = new Sprite();
            curtain.graphics.beginFill(0x000000,1);
            curtain.graphics.drawRect(0,0,465,465);
            curtain.graphics.endFill();
            curtain.alpha = 0;
            this.addChild(curtain);
        }

        private function step(evt:Event):void
        {
        var time:int = sc.position;
        
        if(time > 6900){
            earth.y -= 1.3;
            sun.y += 0.28;
        }
        if(time > 35000){
            earthColor -= 0.0001;
            bmdEarth.colorTransform(bmdEarth.rect, new ColorTransform( 1, 1, earthColor, 1));
         
        }
        
         if(time < 38500){  
         }
         else if(time < 43500){
             textFields[0].visible = true;
            textFields[1].visible = true;
         }
         else if(time < 47500){
             textFields[0].visible = false;
             textFields[1].visible = false;
         }
         else if(time < 53900){
             textFields[2].visible = true;
         }
         else if(time < 56800){
             textFields[2].visible = false;
         }
         else if(time < 72500){
             textFields[3].visible = true;
             textFields[4].visible = true;
         }
         else{
             curtain.alpha +=0.01;
         }

            renderer.renderScene(scene, camera, viewport);
        }
    }
}