flash on 2011-6-2

by yama3
♥0 | Line 127 | Modified 2011-06-02 12:32:09 | MIT License
play

ActionScript3 source code

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

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Point;
    import net.hires.debug.Stats;
    
    [SWF(width="465", height="465", backgroundColor="0xffffff", frameRate="100")]
    
    public class FlashTest extends Sprite {
        private var g:Point = new Point(0,0.01);
        private var b:Number = 0.5;
        private var cf:Number = 0.02;
        private var w:Number;
        private var h:Number;
        private var sb:Ball;
        private var max:Number = 40;
        private var numCols:int;
        private var grid:Array;
        
        public function FlashTest() {
            w = stage.stageWidth;
            h = stage.stageHeight;
            numCols = Math.ceil(h/max);
            var c:int = 150;
            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 = 1 + 19 * Math.random();
            }
            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 = 0; 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;
                            }
                        }
                    }
                }
            }
            
            graphics.clear();
            b1 = sb;
            while(b1) {
                b1.vx += b1.fx;
                b1.vy += (b1.y<h/2)?b1.fy:-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.x);
                graphics.drawCircle(b1.x, b1.y, b1.r);
                b1 = b1.next;
            }
        }
    }
}

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;
}