jbox2d下载怎么没了wheeljoint

2535人阅读
实战(126)
游戏(158)
网络游戏(137)
游戏开发(170)
下面我们将使用Box2D物理引擎技术进行重构。使得关节能够掌握如何在Box2D使用关节约束。HelloWorldScene.cpp中与使用关节的相关代码如下:void HelloWorld::addNewSpriteAtPosition(Vec2 p)
log(&Add sprite %0.2f x %02.f&,p.x,p.y);
//创建物理引擎精灵对象A
auto spriteA = Sprite::create(&BoxA2.png&);
spriteA-&setPosition(p);
this-&addChild(spriteA);
// 动态物体A定义
b2BodyDef bodyD
bodyDef.type = b2_dynamicB
bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);
b2Body *bodyA = world-&CreateBody(&bodyDef);
bodyA-&SetUserData(spriteA);
//创建物理引擎精灵对象B
auto spriteB = Sprite::create(&BoxB2.png&);
spriteB-&setPosition(p + Vec2(100, -100));
this-&addChild(spriteB);
// 动态物体B定义
bodyDef.type = b2_dynamicB
Vec2 posB = spriteB-&getPosition();
bodyDef.position.Set(posB.x/PTM_RATIO , posB.y /PTM_RATIO);
b2Body *bodyB = world-&CreateBody(&bodyDef);
bodyB-&SetUserData(spriteB);
// 定义2米见方的盒子形状
b2PolygonShape dynamicB
dynamicBox.SetAsBox(1, 1);
// 动态物体夹具定义
b2FixtureDef fixtureD
//设置夹具的形状
fixtureDef.shape = &dynamicB
//设置密度
fixtureDef.density = 1.0f;
//设置摩擦系数
fixtureDef.friction = 0.3f;
//使用夹具固定形状到物体上
bodyA-&CreateFixture(&fixtureDef);
bodyB-&CreateFixture(&fixtureDef);
// 距离关节定义
b2DistanceJointDef jointD
jointDef.Initialize(bodyA, bodyB, bodyA-&GetWorldCenter(),
bodyB-&GetWorldCenter());
jointDef.collideConnected =
bodyA-&GetWorld()-&CreateJoint(&jointDef);
}上述代码第①~②行是创建精灵对象A和创建物体A。第③~⑥行是创建精灵对象B和创建物体B。代码第④行是设置精灵B的位置,p是触摸点的位置,p + Vec2(100, -100)表示在触摸点的右下方,相对位置(100, -100)。第⑤行代码是设置物体B的位置,它的单位是米,因此需要精灵B的位置除以PTM_RATIO。第⑦行和第⑧行代码是使用夹具固定形状(2米见方的盒子形状)到物体A和物体B上。由于形状相相同,使用同一个夹具定义fixtureDef分别固定到物体上。第⑨~(12)行代码是添加距离关节,其中第⑨行代码b2DistanceJointDef jointDef是声明距离关节定义,第⑩行代码jointDef.Initialize(bodyA, bodyB, bodyA-&GetWorldCenter(),bodyB-&GetWorldCenter())是初始化距离关节定义,其中第一个和第二参数是物体A和物体B的锚点,第三参数和第四参数是物体A和物体B的世界坐标,bodyA-&GetWorldCenter()函数是获得物体A中心点的世界坐标。第(11)行代码jointDef.collideConnected = true是允许相连的物体碰撞。第(12)行代码bodyA-&GetWorld()-&CreateJoint(&jointDef)是通过物理世界对象根据jointDef(关节定义)创建关节。在上面的实例中,我们只是使用了距离关节,而Box2D v2版本中定义了很多关节。这些关节包括:?距离关节。两个物体之间保持固定的距离。每个物体上的点称为锚点。关节定义是b2DistanceJointDef。?旋转关节。允许物体围绕公共点旋转。关节定义是b2RevoluteJointDef。?平移关节。两个物体之间的相对旋转是固定的,它们可以沿着一个坐标轴进行平移。关节定义是b2PrismaticJointDef。?焊接关节。可以把物体固定在相同方向上。关节定义是b2WeldJointDef。?滑轮关节。滑轮关节用于创建理想的滑轮,两个物体位于绳子两端,绳子通过某个固定点(滑轮的位置)将两个物体连接起来。这样当一个物体升起时,另一个物体就会下降。滑轮两端的绳子总长度不变。关节定义是b2PulleyJointDef。?摩擦关节。降低两个物体之间的相对运动。关节定义是b2FrictionJointDef。?齿轮关节。控制其它两个关节(旋转关节或者平移关节),其中一个的运动会影响另一个。关节定义是b2GearJointDef。?鼠标关节。点击物体上任意一个点可以在世界范围内进行拖动。关节定义是b2MouseJointDef。这些关节定义初始化的时候参数都各不相同,但是参数都是比较类似的。此外,除了上面列出的关节外,还有一些其它的关节,这关节不是很常用,这里不再一一介绍了。更多内容请关注最新Cocos图书《Cocos2d-x实战 C++卷》?本书交流讨论网站:更多精彩视频课程请关注智捷课堂Cocos课程:欢迎加入Cocos2d-x技术讨论群:? 《Cocos2d-x实战 C++卷》现已上线,各大商店均已开售:?京东:亚马逊:当当:互动出版网:?《Cocos2d-x实战 C++卷》源码及样章下载地址:源码下载地址:样章下载地址: ?欢迎关注智捷iOS课堂微信公共平台
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
技术讨论群cocos群:7760386;iOS学习讨论qq群:4462948 技术讨论论坛,关东升图书读者qq群:
访问:1380098次
积分:17030
积分:17030
排名:第428名
原创:366篇
转载:37篇
评论:320条
难度:高级
类型:技术教程
难度:高级
类型:技术教程
难度:高级
类型:技术教程
文章:78篇
阅读:296995
文章:10篇
阅读:23528
文章:54篇
阅读:298719
(3)(4)(11)(12)(13)(10)(18)(15)(11)(9)(20)(1)(2)(20)(15)(15)(20)(13)(16)(16)(1)(4)(4)(10)(14)(11)(8)(8)(3)(8)(6)(5)(5)(1)(4)(1)(13)(7)(8)(2)(19)(6)(1)(1)(6)(2)(3)1737人阅读
cocos2d-x(12)
在熟悉了平移关节和旋转关节后,再来讲解齿轮关节就显得特别容易。
齿轮关节(b2GearJoint)
齿轮关节把两个刚体咬合在一起,来模拟现实世界中的齿轮。就那钟表齿轮为例,一个齿轮转动后就带动另外一个齿轮运动,或作平移运动或作旋转运动。在cocos2d-x的TestCpp中的Box2DTestBed中有个gear的例子。
上图中,左边的例子是三个动态刚体。最小的圆这个刚体和地面刚体用一个旋转关节进行固定.稍大的圆刚体和地面也是用旋转关节联系起来。长方形刚体和地面刚体用平移关节关系起来。然后又有两个齿轮关节。第一个齿轮关节把两个圆联系起来。第二个齿轮关节把大圆和长方形联系起来。所以左图上设计到四个刚体和五个关节。代码看例子代码在gear.h文件中。非常简单。这样当上下移动长方形刚体,则齿轮关节会带动大圆刚体,大圆刚体又带动小圆刚体。
右图中小圆是个静态刚体,所以在其上的所有物理行为都是无效的。然后创建了一个大圆的刚体。然后又创建了一个齿轮关节。
需要注意的是并不是两个刚体要相互接触了齿轮刚体才会有效果(一个带动另外一个)。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:139658次
积分:3079
积分:3079
排名:第8876名
原创:142篇
转载:163篇
评论:10条
(3)(10)(1)(4)(6)(6)(7)(8)(16)(6)(2)(3)(1)(1)(2)(1)(3)(6)(15)(11)(23)(2)(9)(5)(5)(1)(13)(12)(13)(13)(17)(6)(4)(7)(40)(20)(8)(2)114网址导航Cocos2d-x Box2d笔记 :关节的使用 mouseJoint和PrismaticJoint
mouseJoint:
作用是实现鼠标拖拽的效果。
使用方法如下
void HelloWorld::ccTouchesBegan(CCSet *touches, CCEvent *pEvent)&
&&& //CCLOG(&touchBegan&);&
&&& if(mouseJoint!=NULL)&
&&& CCLOG(&touchBegan&);&
&&& CCSetI&
&&& CCTouch*&
&&& for( it = touches-&begin(); it != touches-&end(); it++)&&
&&&&&&& touch = (CCTouch*)(*it);&
&&&&&&& if(!touch)&
&&&&&&&&&&&&
&&&&&&& CCPoint location = touch-&locationInView();&
&&&&&&& location = CCDirector::sharedDirector()-&convertToGL(location);&
&&&&&&& b2Vec2 locationWorld=b2Vec2(location.x/PTM_RATIO,location.y/PTM_RATIO);&
&&&&&&& //这里取得触摸的坐标&
&&&&&&& if(paddleFixeture-&TestPoint(locationWorld))//判断是否在触摸范围&
&&&&&&& {&
&&&&&&&&&&& //if touched&
&&&&&&&&&&& b2MouseJointD&
&&&&&&&&&&& md.bodyA=groundB//一般为世界边界&
&&&&&&&&&&& md.bodyB=paddleB//需要拖动的物体&
&&&&&&&&&&& md.target=locationW//指定拖动的坐标&
&&&&&&&&&&& md.collideConnected= //&
&&&&&&&&&&& md.maxForce=1000.0f*paddleBody-&GetMass(); //给一个拖动的力&
&&&&&&&&&&& mouseJoint=(b2MouseJoint*)world-&CreateJoint(&md);//创建&
&&&&&&&&&&& paddleBody-&SetAwake(true);//&
&&&&&&&&&&& CCLOG(&touchBegan&);&
&&&&&&& }&
上面就定义了mouseJoint的参数
然后再在touchedMoved里面时时改变坐标就OK了
void HelloWorld::ccTouchesMoved(CCSet *touches, CCEvent *pEvent)&
&&& if(mouseJoint==NULL)&
&&& CCSetI&
&&& CCTouch*&
&&& for( it = touches-&begin(); it != touches-&end(); it++)&&
&&&&&&& touch = (CCTouch*)(*it);&
&&&&&&& if(!touch)&
&&&&&&&&&&&&
&&&&&&& CCPoint location = touch-&locationInView();&
&&&&&&& location = CCDirector::sharedDirector()-&convertToGL(location);&
&&&&&&& b2Vec2 locationWorld=b2Vec2(location.x/PTM_RATIO,location.y/PTM_RATIO);&
&&&&&&& mouseJoint-&SetTarget(locationWorld);&
最后记得在touchedEnded里面加上这句释放
if(mouseJoint!=NULL)
& world-&DestroyJoint(mouseJoint);
& mouseJoint=NULL;
&PrismaticJoint
这个就更简单 了
作用是限定一个物理的运动范围
//restrict paddle&
&&&&&&& b2PrismaticJointDef jointD&
&&&&&&& jointDef.collideConnected=&
&&&&&&& b2Vec2 worldAxis(1.0f,0.0f);//这里限定在水平X轴的方向&
&&&&&&& jointDef.Initialize(paddleBody,groundBody,paddleBody-&GetWorldCenter(),worldAxis);//各个参数的意思是,被限定物体,限定的区域(一般是世界),限定点,方向&
&&&&&&& world-&CreateJoint(&jointDef);&
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'Box2D v2.1.0用户手册_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Box2D v2.1.0用户手册
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩93页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 jbox2d 官网 的文章

 

随机推荐