flash on 2013-9-30
/**
* Copyright slugii.chen ( http://wonderfl.net/user/slugii.chen )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/qGOd
*/
package
{
import flash.events.MouseEvent;
import flash.display.AVM1Movie;
import flash.events.Event;
import flash.display.Shape;
import flash.display.Sprite;
public class FlashTest extends Sprite
{
private var mass:Number = 6; //总质量
private var len:Number = 1; //总长度
private var div:Number = 50; //
private var massDiv:Number = mass / div; //每一节的质量
private var lenDiv:Number = len / div; //每一节的长度
private var cX:Number = 300;
private var cY:Number = 200;
private var cR:Number = 50;
private var g:Number = 9.81; //重力加速度
private var pm:Number = 100; // Pixels/meter //像素相对 米的长度比例 总长度为3米 有50节 那么每节相当于1.5个像素
private var dt:Number = 1 / 60; //时间单位 帧频为60的画 dt 相当于一帧的时间 这是时间单位
private var itr:uint = 3;
private var pX:Array = [];
private var pY:Array = [];
private var oX:Array = [];
private var oY:Array = [];
private var aX:Array = [];
private var aY:Array = [];
private var mS:Shape = new Shape(); //每一个点的形状 我在这里 只是当他为一个空点 然后每2个点之间用直线连接
private var fish_1:Sprite = new Sprite(); //第一个鱼
private var fish_2:Sprite = new Sprite(); //第二条鱼
public function FlashTest()
{
// write as3 code here..
//初始化 速度 加速度 位移
for (var i:int = 0; i <= div; i ++)
{
//初始化运动后坐标
pX[i] = 10 + (lenDiv * pm * i);
pY[i] = 10;
//初始化运动前的坐标
oX[i] = 10 + (lenDiv * pm * i);
oY[i] = 10;
//初始化加速度
aX[i] = 0;
aY[i] = 0;
}
drawFish(fish_1, 10, 300, 300);
drawFish(fish_2, 10, 100, 100);
addChild(mS);
addEventListener(Event.ENTER_FRAME, frame);
}
private function drawFish(fish:Sprite, size:int, $x:int, $y:int):void
{
fish.graphics.beginFill(0xFF0000);
fish.graphics.drawCircle(0, 0, size);
fish.graphics.endFill();
addChild(fish);
fish.x = $x;
fish.y = $y;
fish.addEventListener(MouseEvent.CLICK, fishClick);
}
private function fishClick(evt:MouseEvent):void
{
var fish:Sprite = evt.currentTarget as Sprite;
fish.x = stage.mouseX;
fish.y = stage.mouseY;
}
public function frame(evt:Event):void
{
//固定开始点
//最后一个点跟随鼠标运动
pX[pX.length - 1] = fish_2.x;
pY[pY.length - 1] = fish_2.y;
//设置重力加速度
accForces();
verlet();
for (var j:uint = 0; j <= div - 1; j ++)
{
satConstraints();
}
// Draw line
mS.graphics.clear();
mS.graphics.lineStyle(1, 0x000000, 2);
mS.graphics.moveTo(0,0);
mS.graphics.drawCircle(cX, cY, cR);
mS.graphics.moveTo(0, 0);
mS.graphics.moveTo(pX[0], pY[0]);
pX[0] = fish_1.x;
pY[0] = fish_1.y;
pX[pX.length - 1] = fish_2.x;
pY[pY.length - 1] = fish_2.y;
//画圆或者 矩形
for (var i:uint = 0; i <= div; i++)
{
mS.graphics.lineTo(pX[i], pY[i]);
}
}
public function verlet():void
{
for (var i:uint = 0; i <= div; i++)
{
var tempX:Number = pX[i];
pX[i] += (0.99*pX[i] - 0.99*oX[i]) + (aX[i] * pm * dt * dt);
var tempY:Number = pY[i];
pY[i] += (0.99*pY[i] - 0.99*oY[i]) + (aY[i] * pm * dt * dt);
oX[i] = tempX;
oY[i] = tempY;
}
}
public function accForces():void
{
for (var i:uint = 1; i <= div; i++)
{
aY[i] = g;
}
}
public function satConstraints():void
{
for (var i:uint = 1; i <= div; i++)
{
var dx:Number = (pX[i] - pX[i - 1]) / pm;
var dy:Number = (pY[i] - pY[i - 1]) / pm;
var d:Number = Math.sqrt((dx * dx) + (dy * dy));
var diff:Number = d - lenDiv;
pX[i] -= (dx / d) * 0.5 *pm* diff;
pY[i] -= (dy / d) * 0.5 *pm* diff;
pX[i - 1] += (dx / d) * 0.5 *pm* diff;
pY[i - 1] += (dy / d) * 0.5 *pm* diff;
}
}
public function checkColl():void
{
for (var i:uint = 0; i <= div; i++)
{
var dx:Number = pX[i] - cX;
var dy:Number = pY[i] - cY;
var r:Number = Math.sqrt((dx * dx) + (dy * dy));
//trace(r);
var rr:Number = r-cR;
if (rr < 0)
{
// Collision
pX[i] += ( -dx / r) * rr;
pY[i] += ( -dy / r) * rr;
}
}
}
}
}