Color Grid

by hemingway
wip - walker
♥0 | Line 274 | Modified 2013-01-03 04:17:01 | MIT License
play

ActionScript3 source code

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

package
{
    import net.hires.debug.*;
    import flash.display.*;
    import flash.system.*;
    import flash.events.*;
    import flash.geom.*;
    import flash.text.*;
    
    [SWF(frameRate = 60, width = 1024, height = 768)]
    public class Main extends Sprite
    {
        private var horizontalBackdrop :Sprite;
        private var verticalBackdrop :Sprite;
        
        public function Main()
        {
            stage.scaleMode = StageScaleMode.SHOW_ALL;
            
            addEventListener(Event.ADDED_TO_STAGE, addedToStage);
            
            horizontalBackdrop = new Sprite();
            horizontalBackdrop.mouseEnabled = false;
            verticalBackdrop = new Sprite();
        }
        
        public function _init() :void
        {
            var cT :Number = GlobalBuffer.canvasLine;
            var cW :Number = GlobalBuffer.canvasWidth;
            var cH :Number = GlobalBuffer.canvasHeight;

            graphics.lineStyle (cT, 0, 1);
            graphics.beginFill (0, 0.5);
            graphics.drawRect  (0, 0, (cW - 1), (cH - 1));
            graphics.endFill   ();
        }
    
        public function addedToStage($e:Event) :void
        {
            removeEventListener(Event.ADDED_TO_STAGE, addedToStage);
            
            GlobalBuffer.buildGrid(this);    
            addChild(GlobalBuffer.gridOutput = new Output(""));
            addChild(new Output("Red", 40, 60));
            addChild(new Output("Orange", 110, 60));
            addChild(new Output("Yellow", 193, 60));
            addChild(new Output("Lime", 276, 60));
            addChild(new Output("Green", 353, 60));
            addChild(new Output("Aqua", 435, 60));
            addChild(new Output("Cyan", 516, 60));
            addChild(new Output("Azure", 593, 60));
            addChild(new Output("Blue", 676, 60));
            addChild(new Output("Purple", 753, 60));
            addChild(new Output("Violet", 833, 60));
            addChild(new Output("Magenta", 910, 60));
            
            horizontalBackdrop.graphics.beginFill(0xFFFFFF, 0.33);
            horizontalBackdrop.graphics.drawRect (32, 60, 960, 18);
            horizontalBackdrop.graphics.endFill  ();
            
            addChild(horizontalBackdrop);

            _init();
        }
    }    
}

import flash.display.*;
import flash.system.*;
import flash.events.*;
import flash.geom.*;
import flash.text.*;

class GlobalBuffer
{
    public static var canvasLine :Number = 1;
    public static var canvasWidth :Number = 1024;
    public static var canvasHeight :Number = 764;    
    
    public static var gridContext :Object;
    public static var gridScore :Number = 0;
    public static var gridOutput :Output;
    public static var gridNodes :Array = [];
    public static var gridScale :Point = new Point(24, 14);
    public static var gridMarginX :Number = 0.80;
    public static var gridMarginY :Number = 2;
    public static var gridNodeSize :Number = 40;
    public static var gridScatter :Boolean = false;
    public static var gridColor :Array = [0xFF9999, 0xFF8080, 0xFF6666, 0xFF4D4D, 0xFF3333, 0xFF1A1A, 0xFF0000, 0xE60000, 0xCC0000, 0xB30000, 0x990000, 0x800000, //red
                                          0xFFB199, 0xFF9D80, 0xFF8A66, 0xFF764D, 0xFF6333, 0xFF4F1A, 0xFF3C00, 0xE63600, 0xCC3000, 0xB32A00, 0x992400, 0x801E00,
                                          0xFFCE99, 0xFFC180, 0xFFB566, 0xFFA94D, 0xFF9C33, 0xFF901A, 0xFF8400, 0xE67700, 0xCC6900, 0xB35C00, 0x994F00, 0x804200,
                                          0xFFE799, 0xFFE180, 0xFFDB66, 0xFFD54D, 0xFFCF33, 0xFFC91A, 0xFFC400, 0xE6B000, 0xCC9C00, 0xB38900, 0x997500, 0x806200,
                                          0xFFFF99, 0xFFFF80, 0xFFFF66, 0xFFFF4D, 0xFFFF33, 0xFFFF1A, 0xFFFF00, 0xE6E600, 0xCCCC00, 0xB3B300, 0x999900, 0x808000, //yellow
                                          0xE7FF99, 0xE1FF80, 0xDBFF66, 0xD5FF4D, 0xCFFF33, 0xC9FF1A, 0xC4FF00, 0xB0E600, 0x9CCC00, 0x89B300, 0x759900, 0x628000,
                                          0xCFFF99, 0xC3FF80, 0xB8FF66, 0xACFF4D, 0xA0FF33, 0x94FF1A, 0x88FF00, 0x7AE600, 0x6DCC00, 0x5FB300, 0x529900, 0x448000,
                                          0xB4FF99, 0xA2FF80, 0x8FFF66, 0x7CFF4D, 0x69FF33, 0x57FF1A, 0x44FF00, 0x3DE600, 0x36CC00, 0x30B300, 0x299900, 0x228000,
                                          0x99FF99, 0x80FF80, 0x66FF66, 0x4DFF4D, 0x33FF33, 0x1AFF1A, 0x00FF00, 0x00E600, 0x00CC00, 0x00B300, 0x009900, 0x008000, //green
                                          0x99FFB4, 0x80FFA2, 0x66FF8F, 0x4DFF7C, 0x33FF69, 0x1AFF57, 0x00FF44, 0x00E63D, 0x00CC36, 0x00B330, 0x009929, 0x008022,
                                          0x99FFCF, 0x80FFC3, 0x66FFB8, 0x4DFFAC, 0x33FFA0, 0x1AFF94, 0x00FF88, 0x00E67A, 0x00CC6D, 0x00B35F, 0x009952, 0x008044,
                                          0x99FFE7, 0x80FFE1, 0x66FFDB, 0x4DFFD5, 0x33FFCF, 0x1AFFC9, 0x00FFC4, 0x00E6B0, 0x00CC9C, 0x00B389, 0x009975, 0x008062,
                                          0x99FFFF, 0x80FFFF, 0x66FFFF, 0x4DFFFF, 0x33FFFF, 0x1AFFFF, 0x00FFFF, 0x00E6E6, 0x00CCCC, 0x00B3B3, 0x009999, 0x008080, //cyan
                                          0x99E7FF, 0x80E1FF, 0x66DBFF, 0x4DD5FF, 0x33CFFF, 0x1AC9FF, 0x00C4FF, 0x00B0E6, 0x009CCC, 0x0089B3, 0x007599, 0x006280,
                                          0x99CFFF, 0x80C3FF, 0x66B8FF, 0x4DACFF, 0x33A0FF, 0x1A94FF, 0x0088FF, 0x007AE6, 0x006DCC, 0x005FB3, 0x005299, 0x004480,
                                          0x99B4FF, 0x80A2FF, 0x668FFF, 0x4D7CFF, 0x3369FF, 0x1A57FF, 0x0044FF, 0x003DE6, 0x0036CC, 0x0030B3, 0x002999, 0x002280,
                                          0x9999FF, 0x8080FF, 0x6666FF, 0x4D4DFF, 0x3333FF, 0x1A1AFF, 0x0000FF, 0x0000E6, 0x0000CC, 0x0000B3, 0x000099, 0x000080, //blue
                                          0xB499FF, 0xA280FF, 0x8F66FF, 0x7C4DFF, 0x6933FF, 0x571AFF, 0x4400FF, 0x3D00E6, 0x3600CC, 0x3000B3, 0x290099, 0x220080,
                                          0xCF99FF, 0xC380FF, 0xB866FF, 0xAC4DFF, 0xA033FF, 0x941AFF, 0x8800FF, 0x7A00E6, 0x6D00CC, 0x5F00B3, 0x520099, 0x440080,
                                          0xE699FF, 0xDF80FF, 0xD966FF, 0xD24DFF, 0xCC33FF, 0xC61AFF, 0xBF00FF, 0xAC00E6, 0x9900CC, 0x8600B3, 0x730099, 0x600080,
                                          0xFF99FF, 0xFF80FF, 0xFF66FF, 0xFF4DFF, 0xFF33FF, 0xFF1AFF, 0xFF00FF, 0xE600E6, 0xCC00CC, 0xB300B3, 0x990099, 0x800080, //purple
                                          0xFF99E7, 0xFF80E1, 0xFF66DB, 0xFF4DD5, 0xFF33CF, 0xFF1AC9, 0xFF00C4, 0xE600B0, 0xCC009C, 0xB30089, 0x990075, 0x800062,
                                          0xFF99CF, 0xFF80C3, 0xFF66B8, 0xFF4DAC, 0xFF33A0, 0xFF1A94, 0xFF0088, 0xE6007A, 0xCC006D, 0xB3005F, 0x990052, 0x800044,
                                          0xFF99B4, 0xFF80A2, 0xFF668F, 0xFF4D7C, 0xFF3369, 0xFF1A57, 0xFF0044, 0xE6003D, 0xCC0036, 0xB30030, 0x990029, 0x800022
                                          ];
    
    private static var gridCount :Number = 0;
    
    public static function buildGrid($context:Object) :void
    {
        gridContext = $context;
             
        for (var $x:Number = gridMarginX; $x < gridScale.x; $x++)
        {  
            gridNodes[$x] = [];
            
            for (var $y:Number = gridMarginY; $y < gridScale.y; $y++)
            {
                gridNodes[$x][$y] = new GridNode($x, $y, gridNodeSize, gridColor[gridCount]);
                $context.addChild(gridNodes[$x][$y]);
                gridCount += 1;
            }
        }
    }
    
    public static function scatterNode() :void
    {
        for (var $x:Number = gridMarginX; $x < gridScale.x; $x++)
            { for (var $y:Number = gridMarginY; $y < gridScale.y; $y++)
                  { gridNodes[$x][$y].addEventListener(Event.ENTER_FRAME, scatterOnFrame) }}
    }
    
    public static function scatterOnFrame($e:Event) :void
    {
        var $c:Object = $e.currentTarget; 
        var $animX:Number = (Math.random() * (canvasWidth - 52));
        var $animY:Number = (Math.random() * (canvasHeight - 52));
        
        if  (($c.x != $c.randX) && ($c.y != $c.randY)) {$c.x -= Math.round(($c.x - $c.randX)/6); $c.y -= Math.round(($c.y - $c.randY)/6);}
        else {$c.removeEventListener(Event.ENTER_FRAME, scatterOnFrame)}
    }
    
    public static function normalizeNode($caller:Object, $status:Boolean, $difficulty:Number = 24) :void
    {
        var $scale :Point = GlobalBuffer.gridScale;
        var $diff :Number = $difficulty;
        
        if (($caller.x > ($caller.regX - ($scale.x * ($diff / 1.25)))) && ($caller.y > ($caller.regY - ($scale.y * ($diff / 1.25)))) && (($caller.x + $scale.x) < ($caller.regX + ($scale.x * $diff))) && (($caller.y + $scale.y) < ($caller.regY + ($scale.y * $diff)))) {
            if ($status) {if (!$caller.hasEventListener(Event.ENTER_FRAME)) {$caller.addEventListener(Event.ENTER_FRAME, normalizeOnFrame)}}
            else {$caller.removeEventListener(Event.ENTER_FRAME, normalizeOnFrame)}
        }
    }
    
    private static function normalizeOnFrame($e:Event) :void
    {
        var $c:Object = $e.currentTarget;
       
        if (($c.x != $c.regX) && ($c.y != $c.regY)) { $c.x -= ($c.x - $c.regX)/4; $c.y -= ($c.y - $c.regY)/4;}
        else {$c.removeEventListener(Event.ENTER_FRAME, normalizeOnFrame); gridScore+=1; gridOutput.content = "S: " + gridScore}
    }
}

class GridNode extends Sprite
{    
    protected var _x :Number;
    protected var _y :Number;
    protected var _width :Number;
    protected var _height :Number;
    protected var _color :Number;
    protected var _alpha :Number;
    protected var _line :Number;
    protected var _rX :Number;
    protected var _rY :Number;
    
    private var gridX :Number;
    private var gridY :Number;
    private var gridScale :Number;
    
    private var globalBegin :Point = new Point();
    private var globalCurrent :Point = new Point();
    private var localCalc :Point = new Point();
    
    private var op:Output
    
    public function GridNode($x:Number, $y:Number, $scale:Number, $color:Number)
    {
        addEventListener(Event.ADDED_TO_STAGE, addedToStage);
        
        _rX = Math.round(Math.random() * (GlobalBuffer.canvasWidth - 40));
        _rY = Math.round(Math.random() * (GlobalBuffer.canvasHeight - 40));
        _x = gridX = ($x * $scale);
        _y = gridY = ($y * $scale);
        _width = _height = gridScale = $scale;
        _color = $color;
        _alpha = 1;
        _line = 0;
    }
    
    public function _init() :void
    {
        graphics.clear     ();
        graphics.lineStyle (1, 0xFFFFFF, _line);
        
        graphics.beginFill (_color, _alpha);
        graphics.drawRect  (_x, _y, _width, _height);
        graphics.endFill();
    }
    
    public function addedToStage($e:Event) :void
    {
        removeEventListener(Event.ADDED_TO_STAGE, addedToStage);
        
        _init();
        
        addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
    }
    
    public function onMouseDown($e:MouseEvent) :void
    {
        GlobalBuffer.normalizeNode(this, false);
        if (!GlobalBuffer.gridScatter) {GlobalBuffer.scatterNode(); GlobalBuffer.gridScatter = true;}
        
        _line = 0.9; _init();
        parent.setChildIndex(this, (parent.numChildren - 14));
        globalBegin = new Point($e.stageX, $e.stageY);
        
        stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
        stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
        removeEventListener(Event.ENTER_FRAME, GlobalBuffer.scatterOnFrame);
    }
    
    public function onMouseMove($e:MouseEvent) :void
    {
        globalCurrent = new Point($e.stageX, $e.stageY);
        localCalc = Point(globalCurrent.subtract(globalBegin));
        
        x = (x + localCalc.x);
        y = (y + localCalc.y);
        
        globalBegin = globalCurrent;
    }
    
    public function onMouseUp($e:MouseEvent) :void
    {
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
        stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
        
        _line = 0; _init();
        globalBegin = null;
        
        GlobalBuffer.normalizeNode(this, true);
    }
    public function get regX() :Number
    { return gridX }
    public function get regY() :Number
    { return gridY }
    public function get randX() :Number
    { return _rX }
    public function get randY() :Number
    { return _rY }
    public override function get x() :Number
    { return _x }
    public override function get y() :Number
    { return _y }
    public override function set x($:Number) :void
    { _x = $; _init(); }
    public override function set y($:Number) :void
    { _y = $; _init(); }
}

class Output extends TextField
{
    private var textFormat :TextFormat;
    
    protected var _content :String;
    protected var _x :Number;
    protected var _y :Number;
    protected var _font :String;
    
    public function Output($content:String, $x:Number = 1, $y:Number = 0, $font:String = "Helvetica")
    {
        addEventListener(Event.ADDED_TO_STAGE, addedToStage);
        
        _content = $content;
        _x = $x;
        _y = $y;
        _font = $font;
        
        multiline = true;
        autoSize = "left";
        selectable = mouseEnabled = false;
        antiAliasType = AntiAliasType.ADVANCED;
    }
    
    public function _init() :void
    {
        text = _content;
        x = _x;
        y = _y;
        
        textFormat = new TextFormat(_font);
        setTextFormat(textFormat);
    }
    
    public function addedToStage($e:Event) :void
    {
       removeEventListener(Event.ADDED_TO_STAGE, addedToStage);
       
       _init(); 
    }
    
    public function get font() :String
    { return _font }
    public function get nWidth() :Number
    { return width }
    
    public function set font($:String) :void
    { _font = $; _init(); }
    public function set content($:String) :void
    { _content = $; _init(); }
}