Я просто не переделывал код в вашем файле, а написал с нуля. Мой код в классе, но это не должно вам помешать понять его логику. Там почти всё тоже самое.

Код AS3:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
/**
* ...
* @author samana
*/
public class Main extends Sprite
{
private var p:Sprite;
private var pArr:Vector.<Sprite> = new Vector.<Sprite>();
public function Main():void
{
//создаю части верёвки в виде прямоугольников и заношу их в массив
for (var i:int = 0; i < 60; i++)
{
p = new Sprite();
p.graphics.beginFill(0);
p.graphics.drawRect( -3, -2, 6, 4);
p.graphics.endFill();
p.x = i * 5;
p.y = 100;
addChild(p);
pArr[i] = p;
}
//при движении мыши двигаю верёвку
stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
}
private function stage_mouseMove(e:MouseEvent):void
{
//сначала выствляем верёвку от первого звена (которое в координатах мыши)
//до последнего
pArr[0].x = mouseX;
pArr[0].y = mouseY;
for (var i:int = 1; i < pArr.length; i++)
{
var p1:Sprite = pArr[i-1];//предыдущее звено
var p2:Sprite = pArr[i];//текущее звено
var ang:Number = Math.atan2(p1.y - p2.y, p1.x - p2.x);
var dx:Number = p1.x - p2.x;
var dy:Number = p1.y - p2.y;
var dist:Number = Math.sqrt(dx * dx + dy * dy);
p2.rotation = ang * 180 / Math.PI;
if (dist > 10)
{
p2.x += (dist-10)*(dx/dist);
p2.y += (dist-10)*(dy/dist);
}
}
//------------------------- revers
//перебераем звенья в обратном порядке, от фиксированного конца, до начального звена
//фиксирую последее звено
pArr[pArr.length - 1].x = 100;
pArr[pArr.length - 1].y = 100;
//цикл начинаю с предпоследнего звена, ведь последнее звено зафиксировано
for (i=pArr.length-2; i >= 0; i--)
{
p1 = pArr[i+1];//звено следующее (в сторону начала верёвки)
p2 = pArr[i]; // текущее звено
ang = Math.atan2(p1.y - p2.y, p1.x - p2.x);
dx = p1.x - p2.x;
dy = p1.y - p2.y;
dist = Math.sqrt(dx * dx + dy * dy);
p2.rotation = ang * 180 / Math.PI;
if (dist > 10)
{
p2.x += (dist-10)*(dx/dist);
p2.y += (dist-10)*(dy/dist);
}
}
}
}
}