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); } }