flash on 2011-2-2

by yama3
♥0 | Line 252 | Modified 2011-02-02 19:15:07 | 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/AucY
 */

package {
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageQuality;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.events.MouseEvent;
    
    [SWF(width="465",height="465",backgroundColor="0xffffff",frameRate="60")]
    
    public class FlashTest extends Sprite {
        private var _blockContainer:MapChipContainer;
        private var _blockTop:Vector.<Vector.<int>> = new Vector.<Vector.<int>>();
        public function FlashTest() {
            if(stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);           
        }
        
        private function init(event:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            Wonderfl.disable_capture();
            initStage();
            initEventListeners();
            _blockContainer = new MapChipContainer();
            addChild(_blockContainer);
            initBlocks(6,6);
            onResize();
        }
        
        private function initStage():void
        {
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.LEFT;
            stage.quality = StageQuality.HIGH;
        }
        
        private function initEventListeners():void
        {
            stage.addEventListener(Event.RESIZE, onResize);
        }
        
        private function initBlocks(w:int=5, h:int=5):void
        {
            for(var i:int=0; i<w; i++)
            {
                _blockTop[i] = new Vector.<int>();
                for(var k:int = 0; k < h; k++)
                {
                    createBlock(i, k);
                    _blockTop[i][k] = 0;
                }
            }
        }
        
        private function createBlock(x:int, y:int, z:int = 0, tween:Boolean = false):void
        {
            var block:Block = new Block(x, y, z);
            block.addEventListener(MouseEvent.MOUSE_DOWN, onBlockMouseDown);
            block.buttonMode = true;
            _blockContainer.addMapChip(block, tween);
        }
        
        private function onResize(event:Event = null):void
        {
            _blockContainer.x = stage.stageWidth / 2 - _blockContainer.width / 2;
            _blockContainer.y = stage.stageHeight - 150;
        }
        
        private function onBlockMouseDown(event:MouseEvent):void
        {
            var target:Block = event.target as Block;
            var xpos:int = target.localX;
            var ypos:int = target.localY;
            _blockTop[xpos][ypos] = _blockTop[xpos][ypos] + 1;
            createBlock(xpos, ypos, _blockTop[xpos][ypos], true);
        }
    }
}

import flash.display.Graphics;
import flash.display.GraphicsPathCommand;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.utils.Dictionary;
import org.libspark.betweenas3.BetweenAS3;
import org.libspark.betweenas3.easing.Expo;
import org.libspark.betweenas3.easing.Quart;
import org.libspark.betweenas3.easing.Quint;
import org.libspark.betweenas3.events.TweenEvent;
import org.libspark.betweenas3.tweens.IObjectTween;
import org.libspark.betweenas3.tweens.ITween;
import org.libspark.betweenas3.tweens.ITweenGroup;

class MapChipContainer extends Sprite
{
    private var _chips:Vector.<Block> = new Vector.<Block>();
    private var _tween:Dictionary = new Dictionary(true);
    
    public function MapChipContainer()
    {
        super();
    }
    public function addMapChip(chip:Block, tween:Boolean = false):void
    {
        _chips.push(chip);
        addChild(chip);
        setChildIndex(chip, numChildren - 1);
        if(tween)
        {
            var t:IObjectTween = BetweenAS3.tween(chip, {y:chip.y + Block.TWEEN_DISTANCE}, null, 0.4, Quint.easeIn);
            _tween[chip] = t;
            trace(_tween[chip]);
            t.onComplete = sort;
            t.play();
        }
        else
        {
            chip.y += Block.TWEEN_DISTANCE;
            sort();
        }
    }
    
    public function sort():void
    {
        _chips.sort(function(a:Block, b:Block):int {
            if(_tween[a] && _tween[a].isPlaying) return 1;
            if(a.localZ > b.localZ) return 1;
            if(a.localZ < b.localZ) return -1;
            if(a.y == b.y) return 0;
            if(a.y > b.y) return 1;
            return -1;
        })
        var n:int = numChildren;
        for(var i:int; i < n; i++)
        {
            setChildIndex(_chips[i], i);
        } 
    }
}

class Block extends Sprite
{
    public static const COLORS:Array = [0xB5CC7A, 0x728D6C, 0xEDC06B, 0xF48D3E, 0xFF614E, 0xBC554E, 0x47ACBC, 0x4773A4];
    public static const TWEEN_DISTANCE:Number = 200;
    public static const DEFAULT_WIDTH:Number = 60;
    public static const DEFAULT_DEPTH:Number = 40;
    public static const DEFAULT_HEIGHT:Number = 13;
    private var _width:Number = DEFAULT_WIDTH;
    private var _depth:Number = DEFAULT_DEPTH;
    private var _height:Number = DEFAULT_HEIGHT;
    private var _faces:Vector.<Shape> = new Vector.<Shape>();
    private var _localX:int;
    private var _localY:int;
    private var _localZ:int;
    
    public function Block(x:int, y:int, z:int)
    {
        super();
        
        _localX = x;
        _localY = y;
        _localZ = z;
        move(_localX, _localY, _localZ);
        this.y -= TWEEN_DISTANCE;
        createFaces();
        drawFaces();
    }
    public function move(x:int, y:int, z:int):void
    {
        var xpos:int = x * Block.DEFAULT_WIDTH / 2 + y * Block.DEFAULT_WIDTH / 2;
        var ypos:int = y * Block.DEFAULT_DEPTH / 2 + -x * Block.DEFAULT_DEPTH / 2 - z*Block.DEFAULT_HEIGHT;
        this.x = xpos;
        this.y = ypos;
    }
    
    private function createFaces():void
    {
        var top:Shape = new Shape();
        addChild(top);
        _faces.push(top);
        
        var left:Shape = new Shape();
        addChild(left);
        _faces.push(left);
        
        var right:Shape = new Shape();
        addChild(right);
        _faces.push(right);
    }
    
    private function drawFaces():void
    {
        var g:Graphics;
        var commands:Vector.<int>;
        var path:Vector.<Number>;
        
        var rand:int = (Math.random() * (COLORS.length/2) >> 0) * 2;
        var color:uint = COLORS[rand];
        var darkColor:uint = COLORS[rand+1];
        
        commands = Vector.<int>([GraphicsPathCommand.MOVE_TO, GraphicsPathCommand.LINE_TO, GraphicsPathCommand.LINE_TO, GraphicsPathCommand.LINE_TO, GraphicsPathCommand.LINE_TO]);
        
        path = Vector.<Number>([_width/2, 0, 0, _depth / 2, _width / 2, _depth, _width, _depth / 2, _width / 2, 0]);
        g = _faces[0].graphics;
        g.clear();
        g.beginFill(color);
        g.drawPath(commands, path);
        g.endFill();
        
        path = Vector.<Number>([0, _depth/2, 0, _height + _depth / 2, _width / 2, _height + _depth, _width / 2, _depth, 0, _depth / 2]);
        g = _faces[1].graphics;
        g.clear();
        g.beginFill(darkColor);
        g.drawPath(commands, path);
        g.endFill();
        
        path = Vector.<Number>([_width, _depth/2, _width, _height+_depth/2,_width/2,_height+_depth,_width/2,_depth,_width,_depth/2]);
        g = _faces[2].graphics;
        g.clear();
        g.beginFill(darkColor);
        g.drawPath(commands, path);
        g.endFill();
    }
    
    override public function get width():Number
    {
        return _width;
    }
    
    override public function set width(value:Number):void
    {
        _width = value;
        dispatchEvent(new Event(Event.RESIZE));
    }
    
    override public function get height():Number
    {
        return _height;
    }
    
    override public function set height(value:Number):void
    {
        _height = value;
        dispatchEvent(new Event(Event.RESIZE));
    }
    
    public function get faces():Vector.<Shape>
    {
        return _faces;
    }
    
    public function get localX():int
    {
        return _localX;
    }
    
    public function set localX(value:int):void
    {
        _localX = value;
        move(_localX, _localY, _localZ);
    }
    
    public function get localY():int
    {
        return _localY;
    }
    
    public function set localY(value:int):void
    {
        _localY = value;
        move(_localX, _localY, _localZ);
    }
    
    public function get localZ():int
    {
        return _localZ;
    }
    
    public function set localZ(value:int):void
    {
        _localZ = value;
        move(_localX, _localY, _localZ);
    } 
}