[FF]CloudEffect

by bradsedito forked from forked from: forked from: forked from: forked from: forked from: CloudEffect (diff: 83)
♥0 | Line 105 | Modified 2011-08-11 05:05:11 | 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/pA4z
 */

package
 {    
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BitmapDataChannel;
    import flash.display.BlendMode;
    import flash.display.GradientType;
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.display.StageQuality;
    import flash.events.Event;
    import flash.filters.DisplacementMapFilter;
    import flash.filters.DisplacementMapFilterMode;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import net.hires.debug.Stats;
    
    [SWF( frameRate=100) ]
//  [SWF(stageWidth=1000, stageHeight=618, frameRate=100)]
     
    public class CloudEffect1 extends Sprite
    {
        public static const STAGE_W:uint = 1000;
        public static const STAGE_H:uint = 618;
        public static const _H_RATE:Number = 2.5;     
        private var stats:Stats = new Stats();
        private var _perlinNoiseBitmapData:BitmapData;
        private var _seed:int = Math.random()*int.MAX_VALUE;
        private var _perlinNoiseSize:Number = 0.15;   
        private var _perlinNoiseSizeW:int = STAGE_W*_perlinNoiseSize;
        private var _perlinNoiseSizeH:int = STAGE_H*_perlinNoiseSize*_H_RATE;
        private var _cloudSize:int = _perlinNoiseSize * 800;
        private var _speedList:Point
        private var _octaves:int = 5;   
        private var _offsetList:Array = [];   
        private var _offsetSpeedList:Array = [0.2, 0.1, 0.05, 0.02, 0.01];
        private var _displacementBitmapData:BitmapData;  
        private var _displacementMapFilter:DisplacementMapFilter;
        private var _palletBitmapData:BitmapData;
        private var _pallet:Array = [];
        private var _nullPallet:Array = [];
        private var _scaleChangeBitmapData:BitmapData;
        private var _scaleChangeMatrix:Matrix;
        private var _cover:Sprite;
        private var _rect:Rectangle = new Rectangle(0, 0, STAGE_W, STAGE_H);
        private var _point:Point = new Point(0, 0);
        private var _rectSmall:Rectangle = new Rectangle(0, 0, _perlinNoiseSizeW, _perlinNoiseSizeH);
        
        public function CloudEffect1()
        {
            addEventListener(Event.ADDED_TO_STAGE, init);   
        }
        private function init(e:Event):void 
        {          
            removeEventListener(Event.ADDED_TO_STAGE, init);
            //stage.frameRate = 30;
            stage.quality = StageQuality.HIGH;      
            _perlinNoiseBitmapData = new BitmapData(_perlinNoiseSizeW, _perlinNoiseSizeH, false);
            for (var i:int = 0; i < _octaves; i++) _offsetList.push(new Point());            
            _displacementBitmapData = new BitmapData(STAGE_W, STAGE_H, false);
            _displacementMapFilter = new DisplacementMapFilter(null, _point, 0, BitmapDataChannel.RED, 0, 100, DisplacementMapFilterMode.CLAMP);           
            _palletBitmapData = new BitmapData(STAGE_W, STAGE_H, false);
            createGradation();            
            _scaleChangeBitmapData = new BitmapData(STAGE_W, STAGE_H, false);
            _scaleChangeMatrix = new Matrix();
            _scaleChangeMatrix.scale(1/_perlinNoiseSize, 1/_perlinNoiseSize/_H_RATE);           
            _cover = new Sprite();
            var matrix:Matrix = new Matrix();
            matrix.createGradientBox(STAGE_W, STAGE_H, Math.PI/2);
            _cover.graphics.beginGradientFill(GradientType.LINEAR, [0x666666, 0xaaaaaa], [1, 1], [128, 255], matrix);
            _cover.graphics.drawRect(0, 0, STAGE_W, STAGE_H);
            _cover.blendMode = BlendMode.OVERLAY;
            addChild(new Bitmap(_scaleChangeBitmapData));
            addChild(_cover);
            addEventListener(Event.ENTER_FRAME, frame);
        }
        private function createGradation():void
        {   
            var tmpShape:Shape = new Shape();
            var matrix:Matrix = new Matrix();
            matrix.createGradientBox(255, 0);
            var colorList:Array = [0xa7a7c4, 0xf3f8ff, 0xffffff, 0x418fdf];
//          var colorList:Array = [0x824229, 0xfb8f1b, 0xffc768, 0xa0afac];
            var alphaList:Array = [1,        1,        1,        1];
            var ratioList:Array = [0,        80,       100,      200];
            tmpShape.graphics.beginGradientFill(GradientType.LINEAR, colorList, alphaList, ratioList, matrix);
            tmpShape.graphics.drawRect(0, 0, 255, 1);
            var tmpBitmap:BitmapData = new BitmapData(255, 1, false);
            tmpBitmap.draw(tmpShape);
            for (var i:int=0; i<256; i++){
                _pallet.push(tmpBitmap.getPixel(i, 0));
                _nullPallet.push(0x000000);
            }
        }        
        private function frame(event:Event):void
        {
            addChild(stats);      
    
            for (var i:int = 0; i < _octaves; i++)
            { 
                Point(_offsetList[i]).x += Number(_offsetSpeedList[i]);
            }
            _perlinNoiseBitmapData.perlinNoise(_cloudSize, _cloudSize, _octaves, _seed, false, true, 0, true, _offsetList);
            _displacementMapFilter.mapBitmap = _perlinNoiseBitmapData;
            _displacementBitmapData.applyFilter(_perlinNoiseBitmapData, _rectSmall, _point, _displacementMapFilter);
            _displacementBitmapData.draw(_perlinNoiseBitmapData, null, null, BlendMode.HARDLIGHT);
            _palletBitmapData.paletteMap(_displacementBitmapData, _rectSmall, _point, _pallet, _nullPallet, _nullPallet);
            _scaleChangeBitmapData.draw(_palletBitmapData, _scaleChangeMatrix, null, null, null, true);
        }
    }
}