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: gravitation (cleaned and uses vectors)

...
@author ganad
@author Martin Heidegger
/**
 * Copyright tkji ( http://wonderfl.net/user/tkji )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/p3Ua
 */

// forked from leichtgewicht's gravitation (cleaned and uses vectors)
// forked from ganad's gravitation
package 
{
    import flash.events.MouseEvent;
    import flash.display.Shape;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.ColorTransform;
    import flash.display.Sprite;
    
    /**
     * ...
     * @author ganad
     * @author Martin Heidegger
     */
    public class Main extends Sprite 
    {
        private static const AMOUNT_PLANETS: int = 500;
        public static const G: Number = 5.0;
        
        public var _sun:Sun;
        public var _planets:Vector.<Planet> = new Vector.<Planet>();
        
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            stage.frameRate = 40;
            
            createBackground();
            createPlanets(AMOUNT_PLANETS);
            createSun();
            
            addEventListener(Event.ENTER_FRAME, applyGravity);
        }
        
        private function createBackground(): void {
            stage.addEventListener(Event.RESIZE, drawBackground);
            drawBackground();
        }
        
        private function drawBackground(e:Event=null): void {
            graphics.clear();
            graphics.beginFill(0,1);
            graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
        }
        
        private function createPlanets(amount:int):void {
            for( var i: int = 0; i<amount; ++i) {
                addPlanet(
                    randomBetween(60,180) | randomBetween(80,255) << 8 | randomBetween(150,255) << 16,
                    randomBetween(1,40),
                    randomBetween(5,10),
                    randomBetween(-10,10),
                    randomBetween(250,275),
                    randomBetween(90,160)
                )
            }

            /*
            addPlanet(1, 10, -10, 275, 150);
            addPlanet(1, 7, 3, 275, 150);
            addPlanet(40, 5, 5, 275, 100);
            addPlanet(20, 10, 0, 275, 150);
            */
        }
        private function randomBetween(from: Number, to: Number): Number {
            return from + Math.random() * (to-from);
        }

        
        private function addPlanet(color: int, mass: int, vx:Number, vy:Number, x:Number, y:Number): void {
            var planet: Planet = new Planet(color, mass, vx, vy, x, y);
            _planets.push(planet);
            addChild(planet.line);
        }
        
        private function createSun(): void {
            var sun: Sun = new Sun(1000, 0, 0, 275, 200)
            addChild(sun.ball);
            _sun = sun;
        }

        
        private function applyGravity(e:Event = null):void {
            for (var i:int = 0; i < _planets.length; i++) {
                _planets[i].applyGravity(_sun, G);
            }
            _sun.x = mouseX;
            _sun.y = mouseY;
        }      
    }
}

    import flash.display.GraphicsGradientFill;
    import flash.display.IGraphicsPath;
    import flash.display.GraphicsPathCommand;
    import flash.display.GraphicsSolidFill;
    import flash.display.JointStyle;
    import flash.display.CapsStyle;
    import flash.display.LineScaleMode;
    import flash.display.GraphicsPath;
    import flash.display.GraphicsStroke;
    import flash.display.Shape;
    import flash.display.IGraphicsData;


    class StellarObject
    {
        public var vx:Number;
        public var vy:Number;
        public var x:Number = 0;
        public var y:Number = 0;
        public var mass:int;
        
        public function StellarObject(mass:int=50, vx:Number=40,vy:Number=0,x:Number=0,y:Number=0): void
        {
            this.mass = mass;
            this.vx = vx;
            this.vy = vy;
            this.x = x;
            this.y = y;
        }

    }

    class Sun extends StellarObject
    {
        private static const SUN_COLOR: int = 0xffff00;
        
        public var ball: Shape;
        
        public function Sun(mass:int=50, vx:Number=40,vy:Number=0,x:Number=0,y:Number=0): void
        {
            super(mass, vx, vy, x, y);
            ball = new Shape();
            //moveTo(x, y);
        }
        
        public function moveTo(x: Number, y: Number): void {
            this.x = x;
            this.y = y;
            ball.graphics.clear();
            ball.graphics.beginFill(SUN_COLOR, 1);
            ball.graphics.drawCircle(x, y, 10);
            ball.graphics.endFill();
        }
    }


    /**
     * ...
     * @author ganad
     */
    class Planet extends StellarObject
    {
        
        public var line:MovingLine;
        
        public function Planet(color:int = 0xFF0000, mass:int=50, vx:Number=40,vy:Number=0,x:Number=0,y:Number=0) :void
        {
            super(mass, vx, vy, x, y);
            line = new MovingLine(color, x, y);
        }
        
        public function applyGravity(target: StellarObject, gravity: Number): void
        {
            var dx:Number = target.x-this.x;
            var dy:Number = target.y-this.y;
            var dist:Number = dx * dx + dy * dy;
            var angle:Number = Math.atan2(dy, dx);
            var F:Number = gravity * target.mass / dist;
            var vx:Number = F * Math.cos(angle);
            var vy:Number = F * Math.sin(angle);
            this.vx += vx;
            this.vy += vy;
            this.x += this.vx;
            this.y += this.vy;  
            line.moveTo(this.x, this.y);  
        }
    }
    
    class MovingLine extends Shape {
        
        private var _data: Vector.<IGraphicsData>;
        private var _paths: Vector.<GraphicsPath>;
        
        private var _hasMoved: Boolean = false;
        
        public function MovingLine(color: int, x: Number, y: Number) {
            createData(color, x, y, 4);
        }

        
        public function moveTo(x: Number, y: Number): void {
            for( var pathNo: int = 1; pathNo<_paths.length; ++pathNo) {
                var oldPath: GraphicsPath = _paths[pathNo-1];
                var path: GraphicsPath = _paths[pathNo];
                oldPath.data[0] = path.data[0];
                oldPath.data[1] = path.data[1];
            }
            if( !_hasMoved ) {
                path.data[0] = x;
                path.data[1] = y;
                _hasMoved = true;
            }
            path.data[0] = x;
            path.data[1] = y;
            graphics.clear();
            graphics.drawGraphicsData(_data);
        }
        
        private function createStrokes(color: int, segments: int): Vector.<GraphicsStroke> {
            var alpha: Number = 1.0;
            var alphaDecay: Number = alpha/segments;
            var strokes: Vector.<GraphicsStroke> = new Vector.<GraphicsStroke>(segments);
            for( var i: int = 0; i<segments; ++i) {
                 strokes[segments-i-1] = new GraphicsStroke(1, false, LineScaleMode.NONE, CapsStyle.NONE, JointStyle.MITER, 0,
                     new GraphicsSolidFill(color, alpha)
                 );
                 alpha -= alphaDecay;
            }
            return strokes;
        }

        private function createData(color: int, x: Number, y: Number, lines: int): void {
            var strokes: Vector.<GraphicsStroke> = createStrokes(color, lines);
            
            _paths = new Vector.<GraphicsPath>(lines+1);
            _data = new Vector.<IGraphicsData>(lines+_paths.length);
            var path: GraphicsPath = new GraphicsPath(new Vector.<int>(1), new Vector.<Number>(2));
            path.commands[0] = GraphicsPathCommand.MOVE_TO;
            path.data[0] = x;
            path.data[1] = y;
            _paths[0] = path;
            _data[0] = path;
            for( var lineNo: int = 0, dataNo: int = 1; lineNo<lines; ++lineNo, dataNo+=2) {
                path = new GraphicsPath(new Vector.<int>(1), new Vector.<Number>(2));
                _paths[lineNo+1] = path;;
                path.commands[0] = GraphicsPathCommand.LINE_TO;
                path.data[0] = x;
                path.data[1] = y;
                _data[dataNo] = strokes[lineNo];
                _data[dataNo+1] = path;
            }
        }
    }