您的位置:首页 > 移动开发 > Cocos引擎

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

2013-06-02 20:02 429 查看
在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!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  BOX2D 鼠标关节