In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: Proximity step 3

Proximity field - Step 3
@Revision 
-Added attraction to mouse
@author Mario Gonzalez
@see http://onedayitwillmake.com/
/**
 * Copyright FTMSuperfly ( http://wonderfl.net/user/FTMSuperfly )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/lcP6
 */

// forked from onedayitwillmake's Proximity step 3
// forked from onedayitwillmake's forked from: Proximity step 1
// forked from onedayitwillmake's forked from: Proximity step 2
/**
 * Proximity field - Step 3
 * @Revision 
 *         -Added attraction to mouse
 * @author Mario Gonzalez
 * @see http://onedayitwillmake.com/
 */
package
{
    
    import flash.display.GradientType;
    import flash.display.Graphics;
    import flash.display.Shape;
    import flash.display.SpreadMethod;
    import flash.display.Sprite;
    import flash.display.StageQuality;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Matrix;

    [SWF(width="465", height="465", background="#000000")]
    
    public class Proximity extends Sprite
    {
        //Parameters 
        private var _cCount:int = 0;
        private var _cMax:int = 5;
        //Rendering
        private var _canvas:Sprite;
        public  var _canvasGraphics:Graphics
        //Reference 
        public  var _lastCircle:Circle; 
        //Movement
        
        public function Proximity()
        {
            stage.quality = StageQuality.HIGH;
            
            addChildAt(createBG(), 0);
            addChild(_canvas = new Sprite());
            _canvasGraphics = _canvas.graphics;
            
            addEventListener(Event.ENTER_FRAME, loop);
        }
        
        private function createBG():Sprite
        {
            var matr:Matrix = new Matrix();
            matr.createGradientBox(465, 465, Math.PI / 2, 0, 0);
            
            var bg:Sprite = new Sprite();
            bg.graphics.beginGradientFill
            (
                GradientType.LINEAR, 
                [0x000000, 0x3D3D3D], //colors
                [1, 1], //alphas
                [0, 255], //ratios
                matr, //matrix
                SpreadMethod.PAD
            );    
            
            bg.graphics.drawRect(0, 0, 465, 465);
            bg.graphics.endFill();
            
            return bg;
        }
        
        /**
         * Main program loop
         */ 
        private function loop(e:Event):void
        {
            draw();
            create();
        }
        
        /**
         * Creates more circles if we have not reached the maximum count
         */ 
        public function create():void
        {
            if(Math.random() < 0.05 || _cCount >= _cMax) return;
            
            var c:Circle = new Circle(this);
                c.x = c._ix = Math.random() * stage.stageWidth;
                c.y = c._iy = Math.random() * stage.stageHeight;
            _canvas.addChild(c);
            
            _cCount++;
            if(_lastCircle) c._prev = _lastCircle;
                
            _lastCircle = c;
        }
        
        /**
         * Draws the proximity field between the circles
         */ 
        public function draw():void
        {
            _canvas.graphics.clear();
            _canvas.graphics.lineStyle(0.5, 0xffffff, 0.3);
            
            if(_lastCircle == null) return;
            
            _lastCircle.checkForProximity(_lastCircle._prev);
            _lastCircle.move();
            //Connect
                    //_lastCircle.alpha *= 0.6 + Math.random() * 0.4 
                //    _canvas.graphics.moveTo(_lastCircle.x, _lastCircle.y);
                //    _canvas.graphics.curveTo(c.x, c.y, (c.x - _lastCircle.x) * 0.5, (c.y - _lastCircle.y)*0.5);
        }
    }
}


import flash.display.Shape;
import flash.display.Sprite;

/**
 * Circles that live in the feild
 */
class Circle extends Sprite
{
    private var _radius            :Number = Math.random() * 25 + 15;
    private var _curveModifier    :Number    = Math.random() * 30 - 15;
     
     public var _p            :Proximity; //reference
     public var _prev        :Circle;    //Linked list style behavior
    
    //MOVEMENT
    public static var ACC_PARAM:Number = 0.15;
    public static var VELOCITY_PARAM:Number = 0.8
    
    public var _ix:Number;
    public var _iy:Number;
    public var _vx:Number = 0.1;
    public var _vy:Number = 0;
    public var _ax:Number = 0;
    public var _ay:Number = 0;
    /**
     * Individual Circles know only the Circle created previously to their own
     */
    public function Circle(p:Proximity):void
    {
        _p = p;
            
        graphics.beginFill(0x495CAF, 0.5)
        graphics.drawCircle(0, 0, _radius);
        graphics.endFill();
        
        graphics.beginFill(0xFFFFFF)
        graphics.drawCircle(0, 0, 4);
        graphics.endFill();
        
    }
    
    /**
     * Check all previous circles for proximity, and do [something]
     * There is no need for each circle to check the ones ahead, 
     * because they've already checked against this one.
     * 
     * Called recursively for this circle, until the linked list reaches the first circle.
     * Once it does, it calls checkForProximity on its '_prev'
     * The sequence repeats until there are no more previous ones
     * 
     * @param tc:Circle The 'test circle' we will check against.
     */ 
    public function checkForProximity(tc:Circle):void
    {
        if(tc == null) return; // This is the first circle created (unless error of course!)
        var d:Number = Math.sqrt((x - tc.x) * (x - tc.x) + (y - tc.y) * (y - tc.y));
        var polarity:int = Math.random() > 0.5 ? 0.5 : -0.5;
        
        if(d < 85)
        {
            _p._canvasGraphics.moveTo(x, y);
            //_p._canvasGraphics.lineTo(tc.x, tc.y);
            //_p._canvasGraphics.curveTo(tc.x, tc.y);
            _p._canvasGraphics.curveTo((x + tc.x) * 0.5, (y + tc.y) * 0.5 + _curveModifier, tc.x, tc.y);
        }
        
        if(tc._prev)
            checkForProximity(tc._prev);
        else if(_prev)
            _prev.checkForProximity(_prev._prev);
    }
    
    public function move():void
    {
        //distane or 3
        var dist:Number = Math.max(Math.sqrt((x - stage.mouseX) * (x - stage.mouseX) + (y - stage.mouseY) * (y - stage.mouseY)), 40);
        var dy:Number = stage.mouseY - y;
        var dx:Number = stage.mouseX - x
        var angle:Number = Math.atan2(dy, dx);
        var f:Number = 1 / dist * 500;
        
        _ax += Math.cos(angle) * f;
        _ay += Math.sin(angle) * f;
        _ax += (_ix - x) * ACC_PARAM;
        _ay += (_iy - y) * ACC_PARAM;
        _vx = (_vx + _ax) * VELOCITY_PARAM;
        _vy = (_vy + _ay) * VELOCITY_PARAM;
        x += _vx;
        y += _vy;
        _ax = _ay = 0;
        
        if(_prev)
            _prev.move();
    }
    
    public function destroy():void
    {
//         _p._firstCircle = this;
    }    
}