flash on 2010-10-18
♥0 |
Line 151 |
Modified 2010-10-18 16:44:12 |
MIT License
archived:2017-03-20 17:13:17
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;
}
}