droplets

by bradsedito forked from forked from: メタボールの練習 (diff: 18)
import net.hires.debug.Stats;
♥0 | Line 98 | Modified 2011-04-09 10:34:59 | 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/zFP1
 */

// forked from dhaya's forked from: メタボールの練習
// forked from a24's メタボールの練習
package
{
    import flash.display.Sprite;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Graphics;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Point;
    import flash.geom.Matrix;
    import flash.geom.Rectangle;
    import flash.geom.ColorTransform;
    import flash.filters.BlurFilter;

    public class MetaBall extends Sprite
    {
        private var _size:int           = 150;
        private var _num:int            = 3;
        private var blurr:BlurFilter    = new BlurFilter(16,16,3);
        private var _canvas:BitmapData  = new BitmapData( 600,  600 , true , 0x00000000 );
        private var _bmpData:BitmapData = new BitmapData( 600,  600 , true , 0x00000000 );
        private var _rect:Rectangle     = new Rectangle( 0 , 0 , 600 , 600 );
        private var _objAry:Array       = new Array();
        private var _alphaArray:Array   = new Array();
        private var _container:Sprite   = new Sprite();
        private var _moving:Boolean     = false;
        
        public function MetaBall()
        {
r            _container.alpha = 0;
            addChild( _container );
            
            stage.addEventListener(MouseEvent.MOUSE_DOWN, onContainerMouseDown);
            stage.addEventListener(MouseEvent.MOUSE_UP,   onContainerMouseUp);
            
            var adjust:Number = _size / 1000; 
            
            var matrix:Matrix = new Matrix();
            matrix.identity();
            matrix.scale( adjust , adjust );
            
            for ( var i:uint = 0; i < _num; i ++ )
            {
                var sp:Sprite = new Sprite();
                drawGradationCircle( sp.graphics , matrix );
                sp.x = 135 + 150 * int( i % 2 );
                sp.y = 135 + 150 * int( i / 2 );
                
                sp.addEventListener(MouseEvent.MOUSE_DOWN, onSpMouseDown);
                sp.addEventListener(MouseEvent.MOUSE_UP, onSpMouseUp);
                
                _container.addChild( sp );
                _objAry.push( sp );
            }
            addChild( new Bitmap( _canvas ) );
            
            for ( var j:int = 0; j < 256; j ++ )
            {
                if ( j < 200 ) _alphaArray.push( 0 );
                else _alphaArray.push( 0xFF000000 );
            }
            
            addEventListener( Event.ENTER_FRAME , enterFrameHandler );
        }
        
        private function onSpMouseDown(e:MouseEvent):void
        {
            (e.currentTarget as Sprite).startDrag();
        }
        
        private function onSpMouseUp(e:MouseEvent):void
        {
            (e.currentTarget as Sprite).stopDrag();
        }
        
        private function onContainerMouseDown(e:MouseEvent):void
        {
            _moving = true;
        }
        
        private function onContainerMouseUp(e:MouseEvent):void
        {
            _moving = false;
        }
        
        private function enterFrameHandler( e:Event ):void
        {
            this.filters = [blurr];
            _bmpData.fillRect( _rect , 0xCCCCCC );
            _bmpData.draw( _container );
            _bmpData.paletteMap( _bmpData , _rect , _rect.topLeft , null , null , null , _alphaArray );
            _canvas.fillRect( _canvas.rect, 0xffffff);
            _canvas.draw( _bmpData );
            moveBalls();
        }
        
        private function moveBalls():void
        {
            if (_moving) {
                for each ( var s:Sprite in _objAry ) {
                    s.x = s.x; 
                    s.y = s.y;
                    s.blendMode = "difference";
                }
            }
        }
        
        private function drawGradationCircle( g:Graphics , m:Matrix ):void
        {
            g.beginGradientFill( "radial", [ 0 , 0], [ 1 , 0 ] ,  [ 110 , 255 ] , m );
            g.drawCircle( 0 , 0 , _size );
            g.endFill();
        }
    }
}