bool BaseDemo::onTouchBegan(Touch* touch, Event* event)
{
    auto location = touch->getLocation();
    auto shapeArr = _world->getShapes(location);
    
    PhysicsBody* body = nullptr;
    for(auto& obj : shapeArr)
    {
        if((obj->getBody()->getTag() & DRAG_BODYS_TAG) != 0)
        {
            body = obj->getBody();
            break;
        }
    }
    
    if(body != nullptr)
    {
        Node* mouse = Node::create();
        mouse->setPhysicsBody(PhysicsBody::create(PHYSICS_INFINITY, PHYSICS_INFINITY));
        mouse->getPhysicsBody()->setDynamic(false);
        mouse->setPosition(location);
        this->addChild(mouse);
        
        PhysicsJointPin* joint = PhysicsJointPin::construct(mouse->getPhysicsBody(), body, location);
        joint->setMaxForce(5000.0f * body->getMass());
        _world->addJoint(joint);
        _mouses.insert(std::make_pair(touch->getID(), mouse));
        
        return true;
        
    }
    return false;
}
bool HelloWorld::onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *event)
{
    CCLOG("%s", "touch");
    auto location = touch->getLocation();
    auto arr = _scene->getPhysicsWorld()->getShapes(location);//从物理世界得到多边形
    PhysicsBody *body = nullptr;
    for (auto &obj : arr)
    {
        if ((obj->getBody()->getTag() & DRAG_BODYS_TAG) != 0) //得到刚体
        {
            body = obj->getBody();
            break;
        }
    }
    if (body != nullptr)
    {
            //创建一个刚体
        Node *mouse = Node::create();
        mouse->setPhysicsBody(PhysicsBody::create(PHYSICS_INFINITY, PHYSICS_INFINITY));
        mouse->getPhysicsBody()->setDynamic(false);
        mouse->setPosition(location);
        this->addChild(mouse);
        body->setLinearDamping(0.0f);
            //用图钉关节与点中刚体绑定 赋予力 可以拖动
        PhysicsJointPin *joint = PhysicsJointPin::construct(mouse->getPhysicsBody(), body, location);
        joint->setMaxForce(5000.0f * body->getMass());
        _scene->getPhysicsWorld()->addJoint(joint);
        _mouses.insert(std::make_pair(touch->getID(), mouse));
        return true;
    }
    return false;
}
PhysicsJointPin* PhysicsJointPin::construct(PhysicsBody* a, PhysicsBody* b, const Vec2& anchr)
{
    PhysicsJointPin* joint = new (std::nothrow) PhysicsJointPin();
    
    if (joint && joint->init(a, b, anchr))
    {
        return joint;
    }
    
    CC_SAFE_DELETE(joint);
    return nullptr;
}
void PivotJointScene::onEnter()
{
    BaseDemo::onEnter();
    auto visibleSize = VisibleRect::getVisibleRect().size;
    
    float pierPosY = 100.0f;
    Sprite* bridgePierL = createBox(Point(visibleSize.width/2 - 400, pierPosY), Size(40, 40));
    Sprite* bridgePierR = createBox(Point(visibleSize.width/2 + 400, pierPosY), Size(40, 40));
    bridgePierL->setRotation(0);
    bridgePierR->setRotation(0);
    bridgePierL->getPhysicsBody()->setDynamic(false);
    bridgePierR->getPhysicsBody()->setDynamic(false);
    bridgePierL->getPhysicsBody()->setTag(0);
    bridgePierR->getPhysicsBody()->setTag(0);
    this->addChild(bridgePierL);
    this->addChild(bridgePierR);
    
    float ballRadius = 40.0f;
    Sprite* fallingBall = createBall(Point(visibleSize.width/2, visibleSize.height-ballRadius), ballRadius);
    this->addChild(fallingBall);
    
    Vector<Sprite*> bamboos;
    for (int i = 0; i < BAMBOO_SEGMENTS_NUM; i++)
    {
        auto box = createBox(Point(bridgePierL->getPositionX() + BAMBOO_SEGMENT_SIZE.width * i, pierPosY), BAMBOO_SEGMENT_SIZE);
        box->setRotation(0);
        this->addChild(box);
        
        bamboos.pushBack(box);
    }
    
    PhysicsJointPin* pinJointL = PhysicsJointPin::construct(bridgePierL->getPhysicsBody(), bamboos.front()->getPhysicsBody(),bridgePierL->getPosition());
    PhysicsJointPin* pinJointR = PhysicsJointPin::construct(bridgePierR->getPhysicsBody(), bamboos.back()->getPhysicsBody(),bridgePierR->getPosition());
    pinJointL->setCollisionEnable(false);
    pinJointR->setCollisionEnable(false);
    _world->addJoint(pinJointL);
    _world->addJoint(pinJointR);

    
    for (int i = 0; i < BAMBOO_SEGMENTS_NUM - 1; i++)
    {
        auto body1 = bamboos.at(i)->getPhysicsBody();
        auto body2 = bamboos.at(i+1)->getPhysicsBody();
        
        PhysicsJointPin* pivotJointUp = PhysicsJointPin::construct(body1, body2, bamboos.at(i+1)->getPosition() + Point(-BAMBOO_SEGMENT_SIZE.width/2, BAMBOO_SEGMENT_SIZE.height/2));
        
        PhysicsJointPin* pivotJointDown = PhysicsJointPin::construct(body1, body2, bamboos.at(i+1)->getPosition() + Point(-BAMBOO_SEGMENT_SIZE.width/2, -BAMBOO_SEGMENT_SIZE.height/2));
        
        PhysicsJointRotarySpring* springJoint = PhysicsJointRotarySpring::construct(body1, body2, 2000, 0.8f);
        
        pivotJointUp->setCollisionEnable(false);
        pivotJointDown->setCollisionEnable(false);
        springJoint->setCollisionEnable(false);
        _world->addJoint(pivotJointUp);
        _world->addJoint(pivotJointDown);
        _world->addJoint(springJoint);
    }
}