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: Smooth Green Dynamics Spheres

// forked from jbraccini's Smooth Green Dynamics Spheres
package {

    import flash.display.GradientType;
    import flash.display.Sprite;
    import flash.events.TimerEvent;
    import flash.filters.GlowFilter;
    import flash.geom.Matrix;
    import flash.utils.Timer;
    import flash.display.BlendMode;

    [SWF(backgroundColor="#000000", frameRate=25)]
    public class GradientSphere extends Sprite {
    	
    	private const AMOUNT:Number  = 50;

        private var _x:Number = stage.stageWidth/2;
        private var _y:Number = stage.stageHeight/2;
        private var _power:Number = 25;
        private var _epsilonSq:Number = 40000;
        private var _gavityConst:Number = 10000;

        private var lx:Number;
	private var ly:Number;
	private var ldSq:Number;
	private var ld:Number;
	private var lfactor:Number;

    	private var _dpoList:Array = [];
    	private var _colors:Array = [0xeeffee, 0xaaffaa, 0x22ff22, 0x00ff00];
    	private var _render:Timer;
    	private var _sequencer:Timer;
    	
    	private var _background:Sprite;

        public function GradientSphere() {
            // write as3 code here..
			init();
        }

        private function init():void {
        	
        	_render = new Timer(33);
        	_render.addEventListener(TimerEvent.TIMER, handleRender);
        	
        	_sequencer = new Timer(33);
        	_sequencer.addEventListener(TimerEvent.TIMER, handleSequence);
        	
        	drawBackground();
        	start();
        }
        
        private function drawBackground():void {
        	var matrix:Matrix = new Matrix();
        	var backgroundSize:Number = 750;
        	matrix.createGradientBox(backgroundSize, backgroundSize, (3 * Math.PI / 2), 0, 10);
        	
        	_background = new Sprite();
        	_background.graphics.beginGradientFill(GradientType.RADIAL, [0xfffffc, 0xa4ce2c, 0x1d9300, 0x003800], [100, 100, 100, 100], [0, 50, 100, 200], matrix);
        	_background.graphics.drawRect(0, 0, backgroundSize, backgroundSize);
        	
        	_background.x = (-_background.width/2) + (stage.stageWidth/2);
        	_background.y = (-_background.height/2) + (stage.stageHeight/2);

        	addChild(_background);
       	}
        
        private function start():void {
        	_render.start();
        	_sequencer.start();	
        }
        
        private function stop():void {
        	_render.stop();
        	_sequencer.stop();
       	}

        private function getNewGradientSphere(r:Number):Sprite {
            var sphere:Sprite = new Sprite();
            var color:uint = _colors[randRange(0, _colors.length)];
            sphere.graphics.beginGradientFill(GradientType.RADIAL, [color, color], [1,0], [0,r]);
            sphere.graphics.drawCircle(0,0,r);
            sphere.graphics.endFill();

            return sphere;
        }
        
        private function handleRender(e:TimerEvent):void {
        	
        	var dpo:Object;
        	var sphere:Sprite;
        	
        	for(var i:Number = 0; i < _dpoList.length; i++){
        		dpo = _dpoList[i];
        		sphere = dpo.sphere;

                   	sphere.y += dpo.velY*10;
        		sphere.x += dpo.velX*10; 

                        _dpoList[i] = calculateDynamics(dpo);   		
        		
        		if(sphere.y > stage.stageHeight){
        			removeChild(sphere);
        			_dpoList.splice(i, 1);
        		}
        		if(sphere.y < 0){
        			removeChild(sphere);
        			_dpoList.splice(i, 1);
        		}

        		if(sphere.x > stage.stageWidth){
        			removeChild(sphere);
        			_dpoList.splice(i, 1);
        		}
        		if(sphere.x < 0){
        			removeChild(sphere);
        			_dpoList.splice(i, 1);
        		}
        	}
        }

        private function calculateDynamics(dpo:Object):Object{
        	lx = _x - dpo.sphere.x;
	        ly = _y - dpo.sphere.y;
	        ldSq = lx * lx + ly * ly;
                var time:int = 25;
		ld = Math.sqrt( ldSq );
		if( ldSq < _epsilonSq ) ldSq = _epsilonSq;
		lfactor = ( _power * time ) / ( ldSq * ld );
		dpo.velX += lx * lfactor;
		dpo.velY += ly * lfactor;
                return dpo;
        }
        
        private function handleSequence(e:TimerEvent):void {
        	if(_dpoList.length < AMOUNT){
        		
        		var dpo:Object = new Object();
	        	var radius:Number = randRange(1, 50);
	        	var sphere:Sprite = getNewGradientSphere(radius);
                       
	        	sphere.x = randRange(0, stage.stageWidth);
	        	sphere.y = randRange(0, stage.stageHeight);
	        	sphere.blendMode = BlendMode.ADD;
	        	sphere.filters = [new GlowFilter(0x00ff00, 1, 15,15)];
	        	
	        	dpo.sphere = sphere;
	        	dpo.velX   = 0; 
	        	dpo.velY   = 0;
	        	
	        	addChild(sphere);
	        	 
	        	_dpoList.push(dpo);
        	}
        }
        
	private function randRange(start:Number, end:Number) : Number {
		return Math.floor(start +(Math.random() * (end - start)));
	}


}
}