jigsaw bezier

by x10der
♥0 | Line 228 | Modified 2015-04-16 20:18:44 | MIT License
play

ActionScript3 source code

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

package {
    import flash.events.ErrorEvent;
    

    import flash.display.Bitmap;

    import flash.display.Loader;

    import flash.display.Sprite;

    import flash.events.Event;

    import flash.net.URLRequest;

    

    /**

     * ...

     * @author ami hanya ami@orn.co.il

     */

    public class FlashTest extends Sprite

    {

        private var nowbitmap:Bitmap;

        private var piecesArray:Array = new Array();

        private var horizontalPieces:Number = 5;

        private var verticalPieces:Number = 4;

        private var imageWidth:Number;

        private var imageHeight:Number;

        private var pieceWidth:Number;

        private var pieceHeight:Number;

        private var showGuid:Boolean = true;

        private var showGuidCon:Sprite;

        private var regularCon:Sprite;

        

        public function FlashTest():void

        {

            if (stage)

                init();

            else

                addEventListener(Event.ADDED_TO_STAGE, init);

        }

        

        private function init(e:Event = null):void

        {

            removeEventListener(Event.ADDED_TO_STAGE, init);

            var imageLoader:Loader = new Loader();

            var image:URLRequest = new URLRequest("http://wonderfl.net/img/qa/qa_question_en.png");

            imageLoader.addEventListener(ErrorEvent.ERROR, onError);
            imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoad);

            imageLoader.load(image);

        

        }

        private function onError(e:ErrorEvent):void
        {
            trace(e.text);
        }

        

        private function imageLoad(e:Event = null):void

        {
            trace("all good");
            nowbitmap = e.target.content as Bitmap;

            imageWidth = nowbitmap.width;

            imageHeight = nowbitmap.height;

            pieceWidth = Math.round(imageWidth / horizontalPieces);

            pieceHeight = Math.round(imageHeight / verticalPieces);

            if (showGuid)

            {

                showGuidCon = new Sprite

                addChild(showGuidCon);

            }

            regularCon = new Sprite

            addChild(regularCon);

            for (var i:uint = 0; i < horizontalPieces; i++)

            {

                piecesArray[i] = new Array();

                for (var j:uint = 0; j < verticalPieces; j++)

                {

                    piecesArray[i][j] = new Object();

                    piecesArray[i][j].right = Math.floor(Math.random() * 2);

                    piecesArray[i][j].down = Math.floor(Math.random() * 2);

                    if (j > 0)

                    {

                        piecesArray[i][j].up = 1 - piecesArray[i][j - 1].down;

                    }

                    if (i > 0)

                    {

                        piecesArray[i][j].left = 1 - piecesArray[i - 1][j].right;

                    }

                    var n:Number = j + i * verticalPieces;

                    if (showGuid)

                    {

                        var pieceGuid:Piece = new Piece

                        showGuidCon.addChild(pieceGuid);

                        pieceGuid.init({image: nowbitmap.bitmapData, i: i, j: j, tileObj: piecesArray[i][j], horizontalPieces: horizontalPieces, verticalPieces: verticalPieces, crop: {x: i * pieceWidth, y: j * pieceHeight, width: pieceWidth, height: pieceHeight}, x: i * pieceWidth + i, y: j * pieceHeight + j, width: pieceWidth, height: pieceHeight, draggable: false});

                    }

                    var piece:Piece = new Piece

                    regularCon.addChild(piece);

                    piece.init({image: nowbitmap.bitmapData, i: i, j: j, tileObj: piecesArray[i][j], horizontalPieces: horizontalPieces, verticalPieces: verticalPieces, crop: {x: i * pieceWidth, y: j * pieceHeight, width: pieceWidth, height: pieceHeight}, x: i * pieceWidth + i, y: j * pieceHeight + j, width: pieceWidth, height: pieceHeight, draggable: true});

                    

                }

            }

        }

    

    }
}
 


    import com.greensock.easing.*;

    import com.greensock.*;

    import flash.display.Bitmap;

    import flash.display.Graphics;

    import flash.display.Shape;

    import flash.display.Sprite;

    import flash.events.MouseEvent;

    

    /**

     * ...

     * @author ami hanya ami@orn.co.il

     */

    class Piece extends Sprite

    {

        private var image:Bitmap;

        private var obj:Object

        private var gap:Number = 20;

        

        public function Piece()

        {

        

        }

        

        public function init($obj:Object):void

        {

            obj = $obj;

            x = obj.x;

            y = obj.y;

            var offsetX:Number = obj.width * obj.i;

            var offsetY:Number = obj.height * obj.j;

            var x8:Number = Math.round(obj.width / 8);

            var y8:Number = Math.round(obj.height / 8);

            var i:Number = obj.i;

            var j:Number = obj.j;

            var tileObj:Object = obj.tileObj;

            var s:Shape = new Shape

            var context:Graphics = s.graphics;

            

            if (obj.draggable)

            {

                context.lineStyle(2, 0, 1, true, "round");

                context.beginBitmapFill(obj.image);

                

            }

            else

            {

                context.lineStyle(2, 0, .5, true, "round");

                context.beginFill(0xFFFFFF, .5);

                

            }

            context.moveTo(offsetX, offsetY);

            s.x = -offsetX;

            s.y = -offsetY;

            

            if (j != 0)

            {

                context.lineTo(offsetX + 3 * x8, offsetY);

                if (tileObj.up == 1)

                {

                    context.curveTo(offsetX + 2 * x8, offsetY - 2 * y8, offsetX + 4 * x8, offsetY - 2 * y8);

                    context.curveTo(offsetX + 6 * x8, offsetY - 2 * y8, offsetX + 5 * x8, offsetY);

                }

                else

                {

                    context.curveTo(offsetX + 2 * x8, offsetY + 2 * y8, offsetX + 4 * x8, offsetY + 2 * y8);

                    context.curveTo(offsetX + 6 * x8, offsetY + 2 * y8, offsetX + 5 * x8, offsetY);

                }

            }

            context.lineTo(offsetX + 8 * x8, offsetY);

            if (i != obj.horizontalPieces - 1)

            {

                context.lineTo(offsetX + 8 * x8, offsetY + 3 * y8);

                if (tileObj.right == 1)

                {

                    context.curveTo(offsetX + 10 * x8, offsetY + 2 * y8, offsetX + 10 * x8, offsetY + 4 * y8);

                    context.curveTo(offsetX + 10 * x8, offsetY + 6 * y8, offsetX + 8 * x8, offsetY + 5 * y8);

                }

                else

                {

                    context.curveTo(offsetX + 6 * x8, offsetY + 2 * y8, offsetX + 6 * x8, offsetY + 4 * y8);

                    context.curveTo(offsetX + 6 * x8, offsetY + 6 * y8, offsetX + 8 * x8, offsetY + 5 * y8);

                }

            }

            context.lineTo(offsetX + 8 * x8, offsetY + 8 * y8);

            if (j != obj.verticalPieces - 1)

            {

                context.lineTo(offsetX + 5 * x8, offsetY + 8 * y8);

                if (tileObj.down == 1)

                {

                    context.curveTo(offsetX + 6 * x8, offsetY + 10 * y8, offsetX + 4 * x8, offsetY + 10 * y8);

                    context.curveTo(offsetX + 2 * x8, offsetY + 10 * y8, offsetX + 3 * x8, offsetY + 8 * y8);

                }

                else

                {

                    context.curveTo(offsetX + 6 * x8, offsetY + 6 * y8, offsetX + 4 * x8, offsetY + 6 * y8);

                    context.curveTo(offsetX + 2 * x8, offsetY + 6 * y8, offsetX + 3 * x8, offsetY + 8 * y8);

                }

            }

            context.lineTo(offsetX, offsetY + 8 * y8);

            if (i != 0)

            {

                context.lineTo(offsetX, offsetY + 5 * y8);

                if (tileObj.left == 1)

                {

                    context.curveTo(offsetX - 2 * x8, offsetY + 6 * y8, offsetX - 2 * x8, offsetY + 4 * y8);

                    context.curveTo(offsetX - 2 * x8, offsetY + 2 * y8, offsetX, offsetY + 3 * y8);

                }

                else

                {

                    context.curveTo(offsetX + 2 * x8, offsetY + 6 * y8, offsetX + 2 * x8, offsetY + 4 * y8);

                    context.curveTo(offsetX + 2 * x8, offsetY + 2 * y8, offsetX, offsetY + 3 * y8);

                }

            }

            addChild(s)

            if (obj.draggable)

            {

                TweenMax.to(this, .5, {x: Math.round(Math.random() * (obj.image.width - obj.width)), y: Math.round(Math.random() * (obj.image.height - obj.height)), delay: 1 + Math.random(), ease: Back.easeInOut, onComplete: addMouseEvent});

            }

            else

            {

                mouseChildren = false;

                mouseEnabled = false;

            }

        

        }

        

        private function addMouseEvent():void

        {

            if (obj.draggable)

            {

                buttonMode = true;

                addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);

            }

        }

        

        private function mouseDown(e:MouseEvent):void

        {

            startDrag();

            parent.setChildIndex(this, parent.numChildren - 1);

            stage.addEventListener(MouseEvent.MOUSE_UP, mouseUp);

        

        }

        

        private function mouseUp(e:MouseEvent):void

        {

            stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUp);

            stopDrag();

            x = Math.round(x);

            y = Math.round(y);

            if (x < obj.x + gap / 2 && x > obj.x - gap / 2 && y < obj.y + gap / 2 && y > obj.y - gap / 2)

            {

                x = obj.x;

                y = obj.y;

                mouseEnabled = false;

                mouseChildren = false;

                parent.setChildIndex(this, 0);

            }

        }

    

    }