flash on 2010-10-18

by mtok
♥0 | Line 151 | Modified 2010-10-18 16:44:12 | MIT License
play

ActionScript3 source code

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

package  
{
    import flash.display.Graphics;
    import flash.display.Sprite;
    import flash.events.Event;
    
    /**
     * ...
     * @author Motoki Matsumoto
     */
    public class RopeArt2 extends Sprite
    {
        private var _sampler:Sampler;
        private var _pursuer:Sprite;
        private var _hart:String = "M130.424,165.136" + 
                                    "c -71.088, 0 -123.516 -38.559 -129.667 -110.333" +
                                    "C - 4.083 - 1.69, 60.663 - 17.619, 86.091, 58.136"
                                    "c 16, 47.667 - 26.814, 50.765 - 15.333 - 2" + 
                                    "c 15.667 -72, 79.333-71.841,83.333-12.667" + 
                                    "c 4.474, 66.183 -66.833, 125.5 -115.167, 125.5";

        public function RopeArt2() 
        {
            _pursuer = new Sprite();
            addChild(_pursuer);
            _pursuer.addEventListener(Event.ENTER_FRAME, pursue);
            
            _sampler = new Sampler();
            _sampler.target = _pursuer;
            _sampler.check = function(s:*, data:Array):Boolean {
                var _s:* = data[data.length - 1];
                if (_s == undefined) {
                    return true;
                }
                
                var dx:Number = s["x"] - _s["x"];
                var dy:Number = s["y"] - _s["y"];
                if ( dx*dx + dy*dy > 10) { 
                    return true;
                }
                
                return false;
            }
            _sampler.props = ["x", "y"];
            
            
            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
            _sampler.start();
        }
        
        private function pursue(e:Event = null):void 
        {
            var factor:Number = 0.1;
            var p:Sprite = e.target as Sprite;
            p.x += (mouseX - p.x) * factor;
            p.y += (mouseY - p.y) * factor;
        }
        
        private function enterFrameHandler(e:Event):void 
        {
            draw();
        }
        private function draw():void 
        {
            var g:Graphics = graphics;
            g.clear();
            
            _draw2(g);
        }
        private function _draw1(g:Graphics):void 
        {
            g.lineStyle(1, 0x00ff00);
            var dat:Array = _sampler.data;
            dat.forEach(function(elem:*, index:int, arr:Array):void {
                if (!elem) return;
                if (elem.hasOwnProperty("x")) {
                    if (index == 0) {
                        g.moveTo(elem["x"], elem["y"]);
                    }else {
                        g.lineTo(elem["x"], elem["y"]);                        
                    }
                }
            } );            
        }
        private function  _draw2(g:Graphics):void 
        {
            g.lineStyle(4, 0xff0000);
            var dat:Array = _sampler.data;
            var obj:* = dat[0];
            var x0:Number, y0:Number, x1:Number, y1:Number;
            if (dat.length < 2) return;
            if (!dat[0]) return;
            x0 = dat[0].x;
            y0 = dat[0].y;
            x1 = dat[1].x;
            y1 = dat[1].y;
            
            g.moveTo(x0, y0);
            g.lineTo((x0 + x1) * 0.5, (y0 + y1) * 0.5);
            for (var i:int = 1; i < dat.length-1; i++) {
                x0 = dat[i].x;
                y0 = dat[i].y;
                x1 = dat[i+1].x;
                y1 = dat[i+1].y;
                g.curveTo( x0, y0, 0.5*(x0 + x1), 0.5*(y0 + y1));                
            }
            
            g.lineTo(x1, y1);
        }
    }
}
import flash.utils.Timer;
import flash.events.TimerEvent;
class Sampler {
    private var _delay:int = 30;
    private var _target:*;
    private var _props:Array = [];
    private var _timer:Timer;
    private var _data:Array;
    private var _check:Function;
    public function  Sampler():void 
    {
        _data = new Array(30);
        _timer = new Timer(_delay);
        _timer.addEventListener(TimerEvent.TIMER, timerHandler);
    }
    
    private function timerHandler(e:TimerEvent):void 
    {
        if (_target) {
            var s:Object = { };
            _props.forEach( function(elem:*, index:int, arr:Array):void {
                s[arr[index]] = _target[arr[index]];                
            } );
            
            if (_check(s, _data)) {
                addSample(s);
            }
        }        
    }
    private function  addSample(sample:*):void 
    {
        _data.push(sample);
        _data.shift();
    }
    public function start():void 
    {
        _timer.start();
    }
    public function get target():* { return _target; }
    public function set target(value:*):void 
    {
        _target = value;
    }
    
    public function get props():Array { return _props; }
    public function set props(value:Array):void 
    {
        _props = value;
    }
    
    public function get data():Array { return _data; }
    public function set data(value:Array):void 
    {
        _data = value;
    }
    
    public function set check(value:Function):void 
    {
        _check = value;
    }
}