Имеется частица, к которой привязана конструкция из констрейнтов (типа гибкой цепочки), нужно привязать эту цепочку не к центру частицы, а к некой другой точке, отстоящей каким-то образом в стороне от центра. Внизу эта цепочка, извиняюсь если чо за грязный код, первый и последний констрейнт привязаны к двум шарам, которые передаются в конструктор как g1 и g2.
Ну и еще раз задача: сделать так, чтобы эти крайние констрейнты привязывались не к центру шаров, а например к краю, к какой-то другой точке в общем.
Спасибо.

Код:
package {
import flash.events.MouseEvent;
import org.cove.ape.*;
public class Sharf extends Group {
public var bridgeParticles:Array;
private var bridgeConns:Array;
private var downHandler:Function;
private var upHandler:Function;
public function Sharf(colB:uint, colC:uint, colD:uint, g1:Group, g2:Group,downHandlerF:Function=null,upHandlerF:Function=null) {
downHandler=downHandlerF;
upHandler=upHandlerF;
colC=colB;
var globalFriction:Number=0.5;
var bx:Number = g1.particles[0].px;
var by:Number = g1.particles[0].py;
var bsize:Number = 6;
var yslope:Number = 0;
var particleSize:Number = 1;
bridgeParticles=new Array();
bridgeConns=new Array();
var segments:Number=8;
var stifness:Number=1;
var constraintCollidable:Boolean=true;
var particle1:CircleParticle;
var particle2:CircleParticle;
for(var i:Number=0;i<segments;i++)
{
bridgeParticles[i] = new CircleParticle(bx,by,particleSize);
bridgeParticles[i].setStyle(1, 0xFF0000, 1, colB);
bridgeParticles[i].friction=globalFriction;
bridgeParticles[i].mass=0.1;
bridgeParticles[i].sprite.buttonMode=true;
bx += bsize;
by += yslope;
bridgeParticles[i].sprite.addEventListener(MouseEvent.MOUSE_DOWN,downHandler);
addParticle(bridgeParticles[i]);
if(i==0)
{
particle1=g1.particles[0];
particle2=bridgeParticles[i];
}else{
particle1=bridgeParticles[i-1]
particle2=bridgeParticles[i];
}
bridgeConns[i] = new SpringConstraint(particle1, particle2,
stifness, constraintCollidable, particleSize*2, 1,true);
bridgeConns[i].setStyle(1, colC, 0, colB);
SpringConstraint(bridgeConns[i]).fixedEndLimit=1;
addConstraint(bridgeConns[i]);
bridgeConns[i].sprite.buttonMode=true;
bridgeConns[i].sprite.addEventListener(MouseEvent.MOUSE_DOWN,downHandler);
}
bridgeConns[segments] = new SpringConstraint(bridgeParticles[segments-1], g2.particles[0],
stifness, constraintCollidable, particleSize*2, 1,true);
bridgeConns[segments].setStyle(1, colC, 0, colB);
addConstraint(bridgeConns[segments]);
bridgeConns[segments].sprite.buttonMode=true;
bridgeConns[segments].sprite.addEventListener(MouseEvent.MOUSE_DOWN,downHandler);
var bridgeConn:SpringConstraint = new SpringConstraint(g1.particles[0], g2.particles[0],
0.005, false, 1, 1,true);
bridgeConn.setStyle(1, 0xFFFF00, 0, 0xFF0000);
//addConstraint(bridgeConn);
}
public function startListeners():void
{
for each (var part:CircleParticle in bridgeParticles)
{
part.sprite.addEventListener(MouseEvent.MOUSE_DOWN,downHandler);
};
for each (var constr:SpringConstraint in bridgeConns)
{
constr.sprite.addEventListener(MouseEvent.MOUSE_DOWN,downHandler);
};
}
public function stopListeners():void
{
for each (var part:CircleParticle in bridgeParticles)
{
part.sprite.removeEventListener(MouseEvent.MOUSE_DOWN,downHandler);
};
for each (var constr:SpringConstraint in bridgeConns)
{
constr.sprite.removeEventListener(MouseEvent.MOUSE_DOWN,downHandler);
};
}
}
}