flash on 2016-3-4
♥0 |
Line 102 |
Modified 2016-03-04 10:00:53 |
MIT License
archived:2017-03-20 16:21:28
ActionScript3 source code
/**
* Copyright mutantleg ( http://wonderfl.net/user/mutantleg )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/itbw
*/
package {
import flash.events.MouseEvent;
import flash.events.Event;
import flash.display.Sprite;
public class FlashTest extends Sprite {
public function FlashTest() {
vecNode = new Vector.<xNode>(0,false);
var i:int; var num:int; var a:xNode;
num = 6;
for(i=0;i<num;i+=1)
{
a = new xNode();
a.cx = 230;
a.cy = 230+i*8;
a.cx+=i*3;
vecNode.push(a);
}//nexti
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMdown);
stage.addEventListener(MouseEvent.MOUSE_UP, onMup);
stage.addEventListener(Event.ENTER_FRAME, onEnter);
}//ctor
public function onMdown(e:MouseEvent):void { mbutton = 1; }
public function onMup(e:MouseEvent):void { mbutton = 0; }
public var mbutton:int = 0;
public var vecNode:Vector.<xNode>;
public function onEnter(e:Event):void
{
graphics.clear();
graphics.lineStyle(2, 0);
graphics.drawRect(0,0,465,465);
if (mbutton > 0)
{ a = vecNode[vecNode.length-1];
a.cx = stage.mouseX; a.cy = stage.mouseY;
a.vx=0;a.vy=0;
}
var nx:Number; var ny:Number;
var i:int; var num:int; var k:int;
var a:xNode; var b:xNode;
num = vecNode.length;
a = vecNode[0];
a.cx = 230; a.cy=100;
a.vx=0;a.vy=0;
graphics.drawCircle(a.cx,a.cy,8);
for (k=0;k<10;k+=1)
{
for (i=1;i<num;i+=1)
{
a = vecNode[i];
b = vecNode[i-1];
doSpring(a,b,16, 10);
a.vx*=0.999;
a.vy*=0.999;
a.vy +=0.2*0.1;
a.cx+=a.vx; a.cy+=a.vy;
}//nexti
}//nextk
var t:Number; var ax:Number; var ay:Number;
i=0;
for (t=0;t<1;t+=0.05)
{
ax = getBez4(vecNode[0].cx, vecNode[1].cx, vecNode[2].cx, vecNode[3].cx, vecNode[4].cx, vecNode[5].cx, t);
ay = getBez4(vecNode[0].cy, vecNode[1].cy, vecNode[2].cy, vecNode[3].cy, vecNode[4].cy, vecNode[5].cy, t);
if (i ==0) { i=1; graphics.moveTo(ax,ay);}
graphics.lineTo(ax,ay);
}//nextt
/*
for (i=1;i<num;i+=1)
{
a = vecNode[i];
b = vecNode[i-1];
graphics.drawCircle(a.cx,a.cy, 4);
graphics.moveTo(a.cx,a.cy);
graphics.lineTo(b.cx,b.cy);
}//nexti
*/
}//onenter
public function getBez4(x0:Number, x1:Number, x2:Number, x3:Number, x4:Number, x5:Number, t:Number):Number
{ var k0:Number; var k1:Number; var k2:Number; var k3:Number; var k4:Number;
k0 = x0 + (x1 - x0) * t; k1 = x1 + (x2 - x1) * t; k2 = x2 + (x3 - x2) * t;
k3 = x3 + (x4 - x3) * t; k4 = x4 + (x5 - x4) * t;
k0 = k0 + (k1 - k0) * t; k1 = k1 + (k2 - k1) * t; k2 = k2 + (k3 - k2) * t;
k3 = k3 + (k4 - k3) * t;
k0 = k0 + (k1 - k0) * t; k1 = k1 + (k2 - k1) * t; k2 = k2 + (k3 - k2) * t;
k0 = k0 + (k1 - k0) * t; k1 = k1 + (k2 - k1) * t;
return k0 + (k1 - k0) * t;
}//getbez4
public function doSpring(a:xNode, b:xNode, rest:Number=16, dt:Number=1):void
{
var dx:Number; var dy:Number;
var nx:Number; var ny:Number;
var ax:Number; var ay:Number;
var mag:Number; var imp:Number;
dx = a.cx - b.cx; dy = a.cy - b.cy;
mag = Math.sqrt(dx*dx + dy*dy);
if (mag == 0) { mag = 0.00000001; }
nx = dx / mag; ny = dy / mag;
ax = a.vx - b.vx; ay = a.vy - b.vy;
imp = (((ax*nx+ay*ny) + ((mag - rest)/dt)) / (1+1)) * 0.5;
a.vx += imp * (nx*-0.5) * 1;
a.vy += imp * (ny*-0.5) * 1;
b.vx += imp * (nx*0.5) * 1;
b.vy += imp * (ny*0.5) * 1;
}//spring
}//classend
}
internal class xNode
{
public var cx:Number = 0;
public var cy:Number = 0;
public var vx:Number = 0;
public var vy:Number = 0;
}//xnode