夜の光

by beryu
都会の夜っぽい光のつもり。
* フルスクリーンにすると光が右下に偏る不具合が取れない…!
♥2 | Line 104 | Modified 2009-11-29 11:19:26 | MIT License
play

ActionScript3 source code

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

/**
 * 都会の夜っぽい光のつもり。
 * フルスクリーンにすると光が右下に偏る不具合が取れない…!
 */
package {
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.GradientType;
    import flash.display.Sprite;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.filters.BlurFilter;
    import flash.filters.BitmapFilterQuality;
    import flash.geom.Matrix;
    
    [SWF(backgroundColor="0x051100", frameRate="15")]
    
    public class FlowLights extends Sprite {
        private const LIGHT_LENGTH:int = 50; // 光の数
        private const LIGHT_WIDTH:int = 200; // 光の最大幅
        private var _stageSize:Array;
        private var _lights:Array;
        
        public function FlowLights() {
            stage.scaleMode=StageScaleMode.NO_SCALE
            
            // ステージサイズを取得
            _stageSize = [stage.stageWidth, stage.stageHeight];
            
            // 円をLIGHT_LENGTH個用意
            var i:int;
            var light:Light;
            var bmd:BitmapData;
            var sprite:Sprite;
            var random:Number;
            var blurFilter:BlurFilter;
            var blurWidth:int;
            var matrix:Matrix = new Matrix();
            var width:int;
            _lights = [];
            for(i = 1; i < LIGHT_LENGTH; i++)
            {
                random = 1 / (LIGHT_LENGTH) * i;
                light = new Light();
                sprite = new Sprite();
                
                // 円を描く
                width = random * LIGHT_WIDTH;
                matrix.createGradientBox(width, width/2, Math.PI / 2, 0, 0);
                sprite.graphics.beginGradientFill(
                        GradientType.LINEAR, 
                        [
                            int(random * 0x7) * 0x222222 + 0x191500, // 色のバランスはそのままに、明暗だけ変える
                            int(random * 0x7) * 0x222222 + 0x191500
                        ],
                        [1, 1-random], 
                        [0, 255], 
                        matrix);
                sprite.graphics.drawCircle(0, 0, width / 2);
                sprite.graphics.endFill();
                
                // ぼかし効果を入れる
                blurWidth = int(2 / random) * 8;
                blurFilter = new BlurFilter(blurWidth, blurWidth, BitmapFilterQuality.HIGH);
                sprite.filters = [blurFilter];
                
                // 速度差を付ける
                light.increment = random * 3 + 1;
                
                // BitmapDataに描画
                bmd = new BitmapData(width + blurWidth*2, width + blurWidth*2, true, 0);
                bmd.draw(sprite, new Matrix(1, 0, 0, 1, (width + blurWidth*2) / 2, (width + blurWidth*2) / 2));
                
                // 表示
                light.bitmapData = bmd;
                light.visible = true;
                light.x = Math.random() * _stageSize[0] - light.width / 2;
                light.y = Math.random() * _stageSize[1] - light.height / 2;
                light.alpha = 0.01;
                addChild(light);
                _lights.push(light);
            }
            
            // events
            addEventListener(Event.ENTER_FRAME, loop);
            addEventListener(Event.RESIZE, onResize);
        }
        
        private function loop(e:Event):void
        {
            var i:int;
            var blurFilter:BlurFilter;
            var blurWidth:int;
            for(i = 0; i < LIGHT_LENGTH - 1; i++)
            {
                if(!_lights[i].visible)
                {
                    _lights[i].x = Math.random() * _stageSize[0] - _lights[i].width / 2;
                    _lights[i].y = (Math.random() * _stageSize[1]) - _lights[i].height / 2;
                    _lights[i].visible = true;
                }
                else if(_lights[i].y < 0 - _lights[i].height)
                {
                    _lights[i].visible = false;
                    _lights[i].alpha = 0;
                }
                else
                {
                    if(_lights[i].alpha < 1)
                    {
                        _lights[i].alpha += 0.01;
                    }
                    _lights[i].y -= _lights[i].increment;
                }
            }
        }
        
        private function onResize(e:Event):void
        {
            // ステージサイズを取得しなおす
            _stageSize = [stage.stageWidth, stage.stageHeight];
        }
    }
}

import flash.display.Sprite;
import flash.display.Bitmap;

class Light extends Bitmap
{
    public var increment:Number = 1;
}

Forked