cocos2d-x box2d物理引擎深入研究 第一篇之鼠标关节详解(b2MouseJoint)

时间:2021-05-26 04:58:29
在testbed例子中,使用鼠标关节操作刚体,他尝试在刚体上驱动一个点,拖向当前的鼠标位置,在旋转方面没有任何限制.

鼠标关节定义有目标点(target point),最大力矩(maxinum force), 平率(frequency)以及阻尼率(damping ratio).目标点最初与物体的锚点重合。最大力矩阻止多个刚体相互作用时产生剧烈的发作用力.频率和阻尼率是用来创建类似于距离关节(distance joint)的弹簧和减震器效果.

很多用户为了游戏的可玩性尝试修改鼠标关节.用户希望能够实现精确的定位和及时响应。在这方面鼠标关节的工作效果并不好。所以你可以考虑用动力学刚体(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;
	}

It's over!