`

实例介绍Cocos2d-x中Box2D物理引擎:使用关节

阅读更多

下面我们将使用Box2D物理引擎技术进行重构。使得关节能够掌握如何在Box2D使用关节约束。
HelloWorldScene.cpp中与使用关节的相关代码如下:

[html] view plaincopy
 
  1. void HelloWorld::addNewSpriteAtPosition(Vec2 p)  
  2. {      
  3.     log("Add sprite %0.2f x %02.f",p.x,p.y);  
  4.   
  5.   
  6.     //创建物理引擎精灵对象A  
  7.     auto spriteA = Sprite::create("BoxA2.png");                                 ①  
  8.     spriteA->setPosition(p);  
  9.     this->addChild(spriteA);  
  10.   
  11.   
  12.     // 动态物体A定义  
  13.     b2BodyDef bodyDef;  
  14.     bodyDef.type = b2_dynamicBody;  
  15.     bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);  
  16.     b2Body *bodyA = world->CreateBody(&bodyDef);  
  17.     bodyA->SetUserData(spriteA);                                         ②  
  18.   
  19.   
  20.     //创建物理引擎精灵对象B  
  21.     auto spriteB = Sprite::create("BoxB2.png");                                 ③  
  22.     spriteB->setPosition(p + Vec2(100, -100));                                   ④  
  23.     this->addChild(spriteB);  
  24.   
  25.   
  26.     // 动态物体B定义  
  27.     bodyDef.type = b2_dynamicBody;  
  28.     Vec2 posB = spriteB->getPosition();  
  29.     bodyDef.position.Set(posB.x/PTM_RATIO , posB.y /PTM_RATIO);                 ⑤  
  30.     b2Body *bodyB = world->CreateBody(&bodyDef);  
  31.     bodyB->SetUserData(spriteB);                                         ⑥  
  32.   
  33.   
  34.     // 定义2米见方的盒子形状  
  35.     b2PolygonShape dynamicBox;  
  36.     dynamicBox.SetAsBox(1, 1);  
  37.   
  38.   
  39.     // 动态物体夹具定义  
  40.     b2FixtureDef fixtureDef;  
  41.     //设置夹具的形状  
  42.     fixtureDef.shape = &dynamicBox;  
  43.     //设置密度  
  44.     fixtureDef.density = 1.0f;  
  45.     //设置摩擦系数  
  46.     fixtureDef.friction = 0.3f;  
  47.     //使用夹具固定形状到物体上  
  48.     bodyA->CreateFixture(&fixtureDef);                                       ⑦  
  49.     bodyB->CreateFixture(&fixtureDef);                                       ⑧  
  50.   
  51.   
  52.     // 距离关节定义  
  53.     b2DistanceJointDef jointDef;                                            ⑨  
  54.     jointDef.Initialize(bodyA, bodyB, bodyA->GetWorldCenter(),  
  55.         bodyB->GetWorldCenter());                                            ⑩  
  56.     jointDef.collideConnected = true;                                       ⑪  
  57.     bodyA->GetWorld()->CreateJoint(&jointDef);                                    ⑫  
  58.   
  59.   
  60. }  



上述代码第①~②行是创建精灵对象A和创建物体A。第③~⑥行是创建精灵对象B和创建物体B。代码第④行是设置精灵B的位置,p是触摸点的位置,p + Vec2(100, -100)表示在触摸点的右下方,相对位置(100, -100)。第⑤行代码是设置物体B的位置,它的单位是米,因此需要精灵B的位置除以PTM_RATIO。
第⑦行和第⑧行代码是使用夹具固定形状(2米见方的盒子形状)到物体A和物体B上。由于形状相相同,使用同一个夹具定义fixtureDef分别固定到物体上。
第⑨~⑫行代码是添加距离关节,其中第⑨行代码b2DistanceJointDef jointDef是声明距离关节定义,第⑩行代码jointDef.Initialize(bodyA, bodyB, bodyA->GetWorldCenter(),bodyB->GetWorldCenter())是初始化距离关节定义,其中第一个和第二参数是物体A和物体B的锚点,第三参数和第四参数是物体A和物体B的世界坐标,bodyA->GetWorldCenter()函数是获得物体A中心点的世界坐标。第⑪行代码jointDef.collideConnected = true是允许相连的物体碰撞。第⑫行代码bodyA->GetWorld()->CreateJoint(&jointDef)是通过物理世界对象根据jointDef(关节定义)创建关节。
在上面的实例中,我们只是使用了距离关节,而Box2D v2版本中定义了很多关节。这些关节包括:
距离关节。两个物体之间保持固定的距离。每个物体上的点称为锚点。关节定义是b2DistanceJointDef。
旋转关节。允许物体围绕公共点旋转。关节定义是b2RevoluteJointDef。
平移关节。两个物体之间的相对旋转是固定的,它们可以沿着一个坐标轴进行平移。关节定义是b2PrismaticJointDef。
焊接关节。可以把物体固定在相同方向上。关节定义是b2WeldJointDef。
滑轮关节。滑轮关节用于创建理想的滑轮,两个物体位于绳子两端,绳子通过某个固定点(滑轮的位置)将两个物体连接起来。这样当一个物体升起时,另一个物体就会下降。滑轮两端的绳子总长度不变。关节定义是b2PulleyJointDef。
摩擦关节。降低两个物体之间的相对运动。关节定义是b2FrictionJointDef。
齿轮关节。控制其它两个关节(旋转关节或者平移关节),其中一个的运动会影响另一个。关节定义是b2GearJointDef。
鼠标关节。点击物体上任意一个点可以在世界范围内进行拖动。关节定义是b2MouseJointDef。

这些关节定义初始化的时候参数都各不相同,但是参数都是比较类似的。此外,除了上面列出的关节外,还有一些其它的关节,这关节不是很常用,这里不再一一介绍了。

 

 

 

更多内容请关注最新Cocos图书《Cocos2d-x实战 C++卷》
本书交流讨论网站:http://www.cocoagame.net
更多精彩视频课程请关注智捷课堂Cocos课程:http://v.51work6.com
欢迎加入Cocos2d-x技术讨论群:257760386


《Cocos2d-x实战 C++卷》现已上线,各大商店均已开售:

京东:http://item.jd.com/11584534.html

亚马逊:http://www.amazon.cn/Cocos2d-x%E5%AE%9E%E6%88%98-C-%E5%8D%B7-%E5%85%B3%E4%B8%9C%E5%8D%87/dp/B00PTYWTLU

当当:http://product.dangdang.com/23606265.html

互动出版网:http://product.china-pub.com/3770734

 

《Cocos2d-x实战 C++卷》源码及样章下载地址:

源码下载地址:http://51work6.com/forum.php?mod=viewthread&tid=1155&extra=page%3D1 

样章下载地址:http://51work6.com/forum.php?mod=viewthread&tid=1157&extra=page%3D1

欢迎关注智捷iOS课堂微信公共平台
分享到:
评论

相关推荐

    Cocos2d-x 3.x游戏开发实战pdf含目录

    同时,Cocos2d-x集成了Box2D物理引擎,使开发者能轻松实现物理效果,如碰撞检测、重力模拟等。 游戏中的音频管理也是不可或缺的一环。本书会介绍Cocos2d-x的音频API,包括音乐播放、音效处理以及音效资源的加载和...

    Cocos2d-x实战 JS卷 Cocos2d-JS开发

    3. **物理引擎**:介绍Cocos2d-x内置的Box2D物理引擎,用于模拟游戏中的碰撞检测和物理行为。 4. **事件处理**:讲解如何处理用户输入、触摸事件以及游戏内的各种交互事件。 5. **游戏逻辑**:通过实例解析如何...

    cocos2d-x box2d 物理引擎

    在cocos2d-x中,你需要创建一个Box2D的世界实例,这是所有物理模拟的基础。通过设置重力向量和其他参数,你可以控制游戏环境的物理特性。 5. **定义物理对象** 使用Box2D,你可以创建各种形状的物理对象,如矩形...

    Cocos2d-x实战 JS卷

    4. **物理引擎**:了解Cocos2d-x内置的Box2D或Chipmunk物理引擎,如何模拟真实世界的物理行为,如碰撞检测和重力。 5. **事件处理**:掌握事件监听和响应机制,包括触摸事件、键盘事件以及自定义事件的处理,实现...

    瘸腿蛤蟆笔记42-cocos2d-x-3.2 Box2d物理引擎Motor Joint代码

    在Cocos2d-x中,Box2d的物理世界和游戏场景通常通过`cocos2d::Scene`的子类进行结合。你需要重写`update`方法,以便每帧调用`world->Step()`来执行物理模拟,同时处理Motor Joint和其他物理对象的行为。 最后,别忘...

    《Cocos2d-x实战 Lua卷》源码.7z

    5. **动画与物理引擎**:Cocos2d-x提供了强大的动画支持和Box2D物理引擎,源码将展示如何用Lua编写复杂的动画序列,以及如何实现物理效果,如碰撞检测、重力等。 6. **游戏逻辑**:通过实际的游戏逻辑代码,可以...

    瘸腿蛤蟆笔记39-cocos2d-x-3.2 Box2d物理引擎自由落体代码

    在本篇中,我们将深入探讨使用Cocos2d-x 3.2框架集成Box2D物理引擎实现自由落体效果的编程技术。Cocos2d-x是一个广泛使用的开源游戏开发框架,它支持多种平台,包括iOS、Android以及桌面系统。Box2D是一个强大的2D...

    Cocos2d-X游戏源码大合集.rar

    Cocos2d-X集成了Box2D物理引擎,源码中可能包含如何创建物理世界、设置物理属性、实现物理碰撞的示例。 10. **调试和测试**: 源码集合可能包含调试工具和测试用例,这对于理解和改进代码质量非常有用。 通过...

    cocos2d-x 实例源码

    同时,cocos2d-x内置了物理引擎Box2D,这在“愤怒的松鼠”游戏中起到了关键作用。 Box2D是一个2D物理引擎,常用于实现物体碰撞检测、重力模拟等物理效果。在“愤怒的松鼠”中,Box2D可能被用来创建松鼠、障碍物和...

    cocos2d-x 3.x游戏开发实战光盘

    《cocos2d-x 3.x游戏开发实战光盘》是一个深入探讨cocos2d-x 3.x游戏引擎开发的资源集合,旨在帮助开发者通过实际案例掌握这一强大的2D游戏开发工具。cocos2d-x是一款开源的游戏开发框架,基于C++,广泛应用于跨平台...

    cocos2d-x游戏实例-纵版射击游戏

    碰撞检测是判断子弹是否击中敌机的关键,Cocos2d-x提供了Box2D物理引擎的集成,可以用来进行精确的碰撞检测。开发者需要定义合适的碰撞形状,并处理好碰撞回调函数,以执行相应的游戏逻辑,如扣除敌人生命值、增加...

    Cocos2d-X by Example Beginner's Guide

    4. 物理引擎集成:Cocos2d-X可以与Box2D物理引擎无缝对接,用于模拟物体碰撞、重力等物理效果,为游戏添加真实感。 5. 粒子系统:内置的粒子系统让开发者可以轻松创建烟花、火焰、雪花等视觉效果,提升游戏画面的...

    flappy bird 基于cocos2d-x 3.8

    在Cocos2d-x中,你可以通过创建`cc::Sprite`类实例来表示这些对象。鸟的飞行动画可以通过多个精灵帧来实现,而管道则可以作为静态精灵进行显示。 4. **物理引擎**:为了实现鸟的飞行效果,我们需要使用Cocos2d-x...

    cocos2d-x 11-10-20发布的

    cocos2d-x 是一个广泛使用的开源游戏开发框架,尤其在移动平台上备受青睐。2011年10月20日发布的版本为1.0.1-x-0.9.2,这一版本在前一版的基础上进行了多项优化和增强,旨在提供更加稳定、高效的游戏开发环境。本文...

    精通COCOS2D-X游戏开发进阶卷

    《精通COCOS2D-X游戏开发进阶卷》是一本深入探讨Cocos2d-x游戏引擎的专业书籍,旨在帮助开发者提升在Cocos2d-x框架下的游戏制作技能。Cocos2d-x是一款广泛使用的开源游戏开发框架,它基于C++,同时也支持Lua和...

    Cocos2d-x实战lua卷

    这本书的《Cocos2d-x实战Lua卷.pdf》将通过丰富的实例和详细解释,帮助读者掌握使用lua进行Cocos2d-x游戏开发的技能,无论是初学者还是有经验的开发者,都能从中获得宝贵的知识和实践经验。对于想要提升游戏开发能力...

    Cocos2d-x游戏开发实战精解-教学PPT

    "让人物动起来"将深入到角色的动态行为设计,讲解如何使用物理引擎(如Box2D)来实现物体碰撞检测和物理效果,创建出更真实的交互体验。 "高级UI控件"部分会探讨Cocos2d-x中的用户界面设计,包括按钮、滑块、标签等...

    cocos2dx_study.rar_cocos2d-x_cocos2d-x实例_cocos2dx

    cocos2d-x集成了Box2D物理引擎,可以创建复杂的物理模拟,如碰撞检测、重力等。熟悉Box2D的基本概念和API,可以实现真实的物理效果。 七、音频和音效 cocos2d-x支持播放背景音乐和音效,理解如何加载、播放和控制...

    Cocos2d-x 3.x游戏开发之旅_PDF电子书下载 带书签目录 高清完整版.pdf

    4. **物理引擎**:探讨Cocos2d-x内置的Box2D物理引擎,如何实现物体碰撞检测、重力模拟以及物理行为的控制。 5. **用户输入与事件处理**:解析Cocos2d-x的事件模型,如何监听和响应用户的触摸、键盘输入,以及游戏...

    Cocos2d-x高级开发教程_含书签目录_源代码

    3. **物理引擎集成**:讲解如何使用Box2D或Chipmunk等物理引擎,实现游戏中的碰撞检测和物理行为模拟。 4. **音频处理**:介绍Cocos2d-x的音频管理,如何播放背景音乐、音效,并进行音量控制。 5. **用户输入与...

Global site tag (gtag.js) - Google Analytics