Здравствуйте. Пытаюсь удалить соединение из цепочки тел, соединённых revoluteJoint, чтобы при нажатии на кнопку мыши, ближайшее из соединений удалялось (как верёвочка, которую разрезали), но ссылка ведь на соединения в Box2d не сохранятся. Как можно это реализовать? Код такой:
Код AS3:
public class TestLevel extends Sprite
{
private static var mousePVec:b2Vec2 = new b2Vec2();
private static var d_Joint:b2RevoluteJointDef; //вспомогательная переменная (соединение тела)
public function TestLevel():void {
stage.addEventListener(MouseEvent.MOUSE_DOWN, flagCheck); //листенер на нажатие кнопки мыши
stage.addEventListener(MouseEvent.MOUSE_UP, flagCheck); //листенер на отпускание кнопки мыши
boxTablet (); //создаёт дощечку на верёвке
}
private function revoluteJoint(bodyA:b2Body, bodyB:b2Body, anchorA:b2Vec2, anchorB:b2Vec2):void {
d_Joint = new b2RevoluteJointDef();
d_Joint.localAnchorA.Set(anchorA.x, anchorA.y);
d_Joint.localAnchorB.Set(anchorB.x, anchorB.y);
d_Joint.bodyA = bodyA;
d_Joint.bodyB = bodyB;
Box2DHelpers.world.CreateJoint(d_Joint);
}
private function GetBodyAtMouse(includeStatic:Boolean = false):b2Body {//определяет тело находящееся под курсором мыши
mousePVec.Set(Box2DHelpers.mouseXWorldPhys, Box2DHelpers.mouseYWorldPhys);//записываем текущие координаты курсора
var aabb:b2AABB = new b2AABB();//создаем прямоугольную область
aabb.lowerBound.Set(Box2DHelpers.mouseXWorldPhys - 0.001, Box2DHelpers.mouseYWorldPhys - 0.001); //вокруг курсора мыши
aabb.upperBound.Set(Box2DHelpers.mouseXWorldPhys + 0.001, Box2DHelpers.mouseYWorldPhys + 0.001);
var body:b2Body = null;
var fixture:b2Fixture;
function GetBodyCallback(fixture:b2Fixture):Boolean{
var shape:b2Shape = fixture.GetShape(); //получаем шейп который находится под курсором
var joint:b2JointEdge = body.GetJointList();
if (fixture.GetBody().GetType() != b2Body.b2_staticBody || includeStatic){ //если тело не статическое
var inside:Boolean = shape.TestPoint(fixture.GetBody().GetTransform(), mousePVec); //проверяем находится ли точка-позиция курсора в рамках тела
if (inside){ //если да
body = fixture.GetBody(); //получаем ссылку на тело
joint = body.GetJointList();
return false;
}
}
return true;
}
world.QueryAABB(GetBodyCallback, aabb); //проверяем на попадание любых тел в область aabb
return body; //возвращаем тело
}
//создаёт дощечку на верёвке
private function boxTablet ():void
{
// число звеньев, из которых состоит цепь
var links:Number = 2;
// в зависимости от полученного числа звеньев, я рассчитываю длину одного звена
var chainLength:Number = 10 / links;
var _link:b2Body; //тело звена цепи
var _linkDef:b2BodyDef= new b2BodyDef; //геометрические параметры звена цепи
var _linkShapePoligon:b2PolygonShape= new b2PolygonShape; //шейп звена цепи
var _linkFixture:b2FixtureDef= new b2FixtureDef; //физические параметры звена цепи
var _circle:b2Body; //тело круга
var _circleDef:b2BodyDef= new b2BodyDef; //геометрические параметры круга
var _circleShapeCircle:b2CircleShape = new b2CircleShape; //шейп круга
var _circleFixture:b2FixtureDef = new b2FixtureDef(); //физические параметры круга
// шейп круга
_circleShapeCircle = new b2CircleShape(5 / Box2DHelpers.meters); //создаём круг с радиусом rad
_circleDef = new b2BodyDef(); //создаем геометрические параметры тела
_circleDef.position.Set(820 / Box2DHelpers.meters, 250 / Box2DHelpers.meters); //определяем начальные позиции тела
// крепление круга
_circleFixture.density = 1;
_circleFixture.friction = 1;
_circleFixture.restitution = 0.5;
_circleFixture.shape = _circleShapeCircle; //записываем ссылку на шейп. ОБЯЗАТЕЛЬНО
_circleDef.type = b2Body.b2_staticBody;
// создание круга
_circle = Box2DHelpers.world.CreateBody(_circleDef); //ссылка на мир
_circle.CreateFixture(_circleFixture); //крепим к телу объект
// шейп звена цепи
_linkShapePoligon.SetAsBox(1 / Box2DHelpers.meters, chainLength / Box2DHelpers.meters);
// крепление звена цепи
_linkFixture.density = 1;
_linkFixture.shape = _linkShapePoligon;
// тело звена цепи
_linkDef.type = b2Body.b2_dynamicBody;
// создание звена цепи
for (var i:Number = 0; i <= links; i++) {
_linkDef.position.Set(790 / Box2DHelpers.meters, (chainLength + 2 * chainLength * i) / Box2DHelpers.meters);
if (i == 0) {
_link = Box2DHelpers.world.CreateBody(_linkDef); //ссылка на мир
_link.CreateFixture(_linkFixture);
revoluteJoint(_circle, _link, new b2Vec2(0, 0), new b2Vec2(0, -chainLength / Box2DHelpers.meters));
} else {
var newLink:b2Body = Box2DHelpers.world.CreateBody(_linkDef);
newLink.CreateFixture(_linkFixture);
revoluteJoint(_link, newLink, new b2Vec2(0, chainLength / Box2DHelpers.meters), new b2Vec2(0, -chainLength / Box2DHelpers.meters));
_link = newLink;
}
}
var _box:b2Body; //тело
var _boxDef:b2BodyDef; //геометрические параметры тела
var _boxShapePoligon:b2PolygonShape; //шейп
var _boxFixture:b2FixtureDef; //физические параметры тела
_boxDef = new b2BodyDef(); //создаем геометрические параметры тела
_boxDef.position.Set(797 / Box2DHelpers.meters, 335 / Box2DHelpers.meters); //определяем начальные позиции тела
//_boxDef.angle = rot * Math.PI / 180
_boxDef.type = b2Body.b2_dynamicBody;
_boxShapePoligon = new b2PolygonShape(); //создаем шейп
_boxShapePoligon.SetAsBox((1 / 2) / Box2DHelpers.meters, (190 / 2) / Box2DHelpers.meters); //w-ширина тела, h-выстота тела
_boxFixture = new b2FixtureDef(); //создаем объект крепим к телу объект
_boxFixture.shape = _boxShapePoligon; //записываем ссылку на шейп. ОБЯЗАТЕЛЬНО
_boxFixture.density = 2; //плотность
_boxFixture.friction = 0.3; //трение
_boxFixture.restitution = 0.1; //упругость
_box = Box2DHelpers.world.CreateBody(_boxDef); //ссылка на мир
_box.CreateFixture(_boxFixture); //крепим к телу объект
// прикрепляем дощечку к концу цепи
revoluteJoint(_link, _box, new b2Vec2(0, chainLength / Box2DHelpers.meters), new b2Vec2(0, 2.5));
if (Box2DHelpers.isMouseDown){ //если кнопка мыши нажата
var body:b2Body = GetBodyAtMouse(); //получаем ссылку на тело которое находится под курсором мыши
if (body){
}
Box2DHelpers.world.DestroyJoint(d_Joint);//удаляем его соединение
}
}
За основу взял функцию MouseDrag() из Box2DHelpers. Пытаюсь её переделать под этот случай, но не выходит( Выкладываю исходник, чтобы наглядней было.
Test.rar