forked from: Phys

by owenray forked from Phys (diff: 39)
...
@author lizhi
♥0 | Line 148 | Modified 2011-06-01 21:02:52 | MIT License
play

ActionScript3 source code

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

// forked from sliz's Phys
package 
{
    import flash.geom.Rectangle;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.geom.Matrix;
    import flash.display.GradientType;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Point;
    import net.hires.debug.Stats;
    
    /**
     * ...
     * @author lizhi
     */
    [SWF(width = 465, height = 465, backgroundColor = 0xffffff, frameRate = 60)]
    public class Main extends Sprite 
    {
        private var g:Point = new Point(0,.8);
        private var b:Number = 1.5;
        private var cf:Number = .1;
        private var w:Number;
        private var h:Number;
        
        private var sb:Ball;
        private var max:Number = 10;
        private var numCols:int;
        private var grid:Array;
        
        private var bm:Bitmap = new Bitmap();
        private var draw:Sprite = new Sprite();
        
        private var bmd:BitmapData = new BitmapData(465, 465, false, 0),
                    theWaterColor:BitmapData = new BitmapData(465, 465, false);                
        public function Main():void 
        {
            w = stage.stageWidth;
            h = stage.stageHeight;
            numCols = Math.ceil(h / max);
            var c:int = 80;
            var b:Ball;
            while(c-->0){
                var ball:Ball = new Ball();
                if (sb) {
                    b.next = ball;
                    b = ball;
                }else {
                    sb = b = ball;
                }
                ball.x = w * Math.random();
                ball.y = h * Math.random();
                ball.r = 10 + 10 * Math.random();
            }
            addChild(bm);
            
            sb.r = 20;
            addEventListener(Event.ENTER_FRAME, update);
            addChild(new Stats());
            
        }
        
        private function update(e:Event):void 
        {
            grid = [];
            var b1:Ball = sb;
            sb.x = mouseX;
            sb.y = mouseY;
            while (b1) {
                var x:int = (b1.x + 0.5) / max;
                var y:int = (b1.y + 0.5) / max;
                var v:int = y * numCols + x;
                if (grid[v]==null) {
                    grid[v] = [];
                }
                grid[v].push(b1);
                b1.c = 0;
                b1 = b1.next;
            }
            
            for (var k:int = grid.length - 1; k >= 0;k-- ) {
                var balls:Array = grid[k];
                if (balls) {
                    var arr2:Array = grid[k - 1];
                    if (arr2) {
                        balls = balls.concat(arr2);
                    }
                    arr2 = grid[k - numCols];
                    if (arr2) {
                        balls = balls.concat(arr2);
                    }
                    arr2 = grid[k - numCols - 1];
                    if (arr2) {
                        balls = balls.concat(arr2);
                    }
                    arr2 = grid[k - numCols + 1];
                    if (arr2) {
                        balls = balls.concat(arr2);
                    }
                    for (var i:int = 0; i < balls.length; i++ ) {
                        b1 = balls[i];
                        b1.fy += g.y;
                        if (b1.x - b1.r < 0) b1.fx += b;
                        if (b1.x + b1.r > w) b1.fx -= b;
                        if (b1.y - b1.r < 0) b1.fy += b;
                        if (b1.y + b1.r > h) b1.fy -= b;
                        for (var j:int = i + 1; j < balls.length; j++ ) {
                            var b2:Ball = balls[j];
                            var dx:Number = b1.x - b2.x;
                            var dy:Number = b1.y - b2.y;
                            var d:Number = b1.r + b2.r;
                            if (dx * dx + dy * dy < d * d ) {
                                b1.fx += dx *cf;
                                b1.fy += dy *cf;
                                b2.fx -= dx *cf;
                                b2.fy -= dy * cf;
                                b1.c = 0xff0000;
                                b2.c = 0xff0000;
                            }
                        }
                    }
                }
            }
            
            draw.graphics.clear();
            b1 = sb;
            while (b1) {
                b1.vx += b1.fx;
                b1.vy += b1.fy;
                b1.vx *= 0.95;
                b1.vy *= 0.95;
                b1.x += b1.vx;
                b1.y += b1.vy;
                b1.fx = 0;
                b1.fy = 0;
                //graphics.lineStyle(0,b1.c);
                var m:Matrix = new Matrix();
                var drawBigger:Number = 2;
                m.createGradientBox(b1.r*2*drawBigger, b1.r*2*drawBigger, 0, b1.x-b1.r*drawBigger, b1.y-b1.r*drawBigger);
                draw.graphics.beginGradientFill(GradientType.RADIAL, [0, 0], [1, 0], [0, 255], m);
                draw.graphics.drawCircle(b1.x, b1.y, b1.r*drawBigger);
                b1 = b1.next;
            }
            
            bmd.fillRect(new Rectangle(0, 0, 465, 465), 0xFFFFFF);
            bmd.draw(draw);
            
            theWaterColor.fillRect(new Rectangle(0, 0, 465, 465), 0x0000FF);
            bm.bitmapData = theWaterColor;
            //bmd.draw(draw);
            //bm.bitmapData = bmd;
            bm.bitmapData.threshold(bmd, new Rectangle(0, 0, 465, 465), new Point(0, 0), ">=", 0xbbbbbb, 0x00FFFFFF, 0x00FFFFFF, false);
            //bm.smoothing =true;
        }
        
    }
    
}
class Ball {
    public var next:Ball;
    public var c:uint = 0;
    public var x:Number = 0;
    public var y:Number = 0;
    public var r:Number = 10;
    public var vx:Number = 0;
    public var vy:Number = 0;
    public var fx:Number = 0;
    public var fy:Number = 0;
}