MyTetra Share
Делитесь знаниями!
О, смотри-ка какое хорошее место. Дайте два!
Пример на Flash по объекту b2MouseJoin, попробовать сделать то же самое в C++
29.11.2017
23:20
Раздел: Компьютер - Программирование - Физические движки - Box2D

   

// Объект соединения тела и курсора мышки

    private var _mJoint: b2MouseJoint;

    

    private function GetBodyAtMouse(includeStatic:Boolean = false): b2Body

    {

      var mXWorldPhys: Number = mouseX * MPP;

      var mYWorldPhys: Number = mouseY * MPP;

      var mousePVec: b2Vec2 = new b2Vec2(mXWorldPhys, mYWorldPhys);//записываем текущие координаты курсора

      var aabb: b2AABB = new b2AABB(); // создаем прямоугольную область

      aabb.lowerBound.Set(mXWorldPhys - 0.001, mYWorldPhys - 0.001); //вокруг курсора мыши

      aabb.upperBound.Set(mXWorldPhys + 0.001, mYWorldPhys + 0.001);

      var body: b2Body = null;

      var fixture: b2Fixture;


      function GetBodyCallback(fixture:b2Fixture): Boolean

      {

        var shape:b2Shape = fixture.GetShape(); //получаем шейп который находится под курсором

        // если тело не статическое

        if (fixture.GetBody().GetType() != b2Body.b2_staticBody || includeStatic) {

          // проверяем находится ли точка-позиция курсора в рамках тела

          var inside: Boolean = shape.TestPoint(fixture.GetBody().GetTransform(), mousePVec);

          // если да

          if (inside) {

            body = fixture.GetBody(); //получаем ссылку на тело

            return false;

          }

        }

        return true;

      }


      _world.QueryAABB(GetBodyCallback, aabb); //проверяем на попадание любых тел в область aabb


      return body; //возвращаем тело

    }

    


// Клик по клавише мышки    

    private function onMouseDown(e:MouseEvent):void

    {

      // если соединение уже есть, то уничтожаем его

      if (_mJoint)

        destroyCurrentJoint();


      // получаем тело под курсором

      var body:b2Body = GetBodyAtMouse();

      if (body) {

        var md:b2MouseJointDef = new b2MouseJointDef(); //создаем настройки соединения

        md.bodyA = _world.GetGroundBody(); //один конец крепим к миру

        md.bodyB = body; //другой к телу

        md.target.Set(mouseX * MPP, mouseY * MPP); //соединение создается от курсора мыши

        md.collideConnected = true;

        md.maxForce = 3000; //макс. сила которая может быть приложена к телу

        _mJoint = _world.CreateJoint(md) as b2MouseJoint; //создаем соединение

        body.SetAwake(true); //будим тело

      }

    }



// Получение ground body в C++ в box2d 2.x.x, чтобы прикрепить к миру

b2BodyDef bd;

m_groundBody = CreateBody(&bd);


    

    private function destroyCurrentJoint():void

    {

      if (_mJoint)

        _world.DestroyJoint(_mJoint); // удаляем соединение

      _mJoint = null;

    }

    

    private function onMouseUp(e:MouseEvent):void

    {

      destroyCurrentJoint();

    }

    

    private function onEnterFrameHandler(e:Event):void

    {

      updateBox2D(1 / stage.frameRate);

      

      if (_mJoint) { //если кнопка мыши нажата и соединение уже существует

        var p2:b2Vec2 = new b2Vec2(mouseX * MPP, mouseY * MPP);

        _mJoint.SetTarget(p2); //перемещаем соединение за курсором мыши

      }

    }

    

  }

 

}


 
MyTetra Share v.0.52
Яндекс индекс цитирования