很多用户为了游戏的可玩性尝试修改鼠标关节.用户希望能够实现精确的定位和及时响应。在这方面鼠标关节的工作效果并不好。所以你可以考虑用动力学刚体(kinematic body)进行代替.
鼠标关节比较简单。下面是代码:
首先在ccTouchBegan中:
//判断鼠标是否点在了刚体上。 CCPoint mousePt = touch->getLocation(); b2Body *pBody = m_world->GetBodyList(); for(; pBody != NULL; pBody = pBody->GetNext()) { b2Fixture *pFixture = pBody->GetFixtureList(); for(;pFixture != NULL;pFixture = pFixture->GetNext()) { b2Vec2 mouseVec; mouseVec.Set(mousePt.x/PTM_RATIO, mousePt.y/PTM_RATIO); if(pFixture->TestPoint(mouseVec)) { //创建鼠标关节. b2MouseJointDef md; md.bodyA=m_groundBody;//一般为世界边界 md.bodyB=pBody;//需要拖动的物体 md.target=mouseVec;//指定拖动的坐标 md.collideConnected=true; // md.maxForce=1000.0f*pBody->GetMass(); //给一个拖动的力 m_mouseJoint=(b2MouseJoint*)m_world->CreateJoint(&md);//创建 pBody->SetAwake(true);// return true; } } }
其次,在鼠标滑动或者在屏幕上滑动的时候。
if(m_mouseJoint == NULL ) return; b2Vec2 vecMouse; vecMouse.Set((touch->getLocation().x)/PTM_RATIO, (touch->getLocation().y)/PTM_RATIO); //改变关节位置. m_mouseJoint->SetTarget(vecMouse);
//销毁关节. if(m_mouseJoint != NULL) { m_world->DestroyJoint(m_mouseJoint); m_mouseJoint =NULL; }