Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Box2D] Удаление соединений кликом мыши в Box2d (http://www.flasher.ru/forum/showthread.php?t=202838)

Fazer 14.08.2013 17:13

Удаление соединений кликом мыши в Box2d
 
Вложений: 1
Здравствуйте. Пытаюсь удалить соединение из цепочки тел, соединённых 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. Пытаюсь её переделать под этот случай, но не выходит( Выкладываю исходник, чтобы наглядней было.
Вложение 29908


Часовой пояс GMT +4, время: 08:45.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.