在游戏中我们可以通过关节约束两个物体的运动。我们通过一个距离关节实例,介绍一下如何在使用关节。

这个实例的运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点和附近生成两个新的精灵,它们的运行是自由落体运动,它们之间的距离是固定的。图示是开启了绘制调试遮罩,从图中可见,调试遮罩不仅会显示物体,还会显示关节。

使用距离关节实例

使用距离关节实例(绘制调试遮罩)

代码部分中HelloWorldScene.h文件与上一节的实例非常类似,不再介绍了。HelloWorldScene.cpp中创建物理世界和指定世界的边界语句是在HelloWorld::createScene()和HelloWorld::init()函数中,这两个函数类似于上一节实例,这里也不再解释这些函数代码了。

HelloWorldScene.cpp中与使用关节的相关代码如下:

  1. bool HelloWorld::onTouchBegan(Touch* touch, Event* event)
  2. {
  3. Vec2 location = touch->getLocation();
  4. addNewSpriteAtPosition(location);
  5. return false;
  6. }
  7. void HelloWorld::addNewSpriteAtPosition(Vec2 p)
  8. {
  9. Size visibleSize = Director::getInstance()->getVisibleSize();
  10. Vec2 origin = Director::getInstance()->getVisibleOrigin();
  11. auto boxA = Sprite::create("BoxA2.png");     ①
  12. boxA->setPosition(origin+ p);     ②
  13. auto boxABody = PhysicsBody::createBox(boxA->getContentSize());   ③
  14. boxA->setPhysicsBody(boxABody);   ④
  15. addChild(boxA, 10, 100);     ⑤
  16. auto boxB = Sprite::create("BoxB2.png");
  17. boxB->setPosition(origin + p + Vec2(0, -120));
  18. auto boxBBody = PhysicsBody::createBox(boxB->getContentSize());
  19. boxB->setPhysicsBody(boxBBody);
  20. addChild(boxB, 20, 101);
  21. auto world = this->getScene()->getPhysicsWorld();  ⑥
  22. PhysicsJointDistance* joint = PhysicsJointDistance::construct(boxABody, boxBBody,
  23. Vec2(0, 0), Vec2(0, boxB->getContentSize().width / 2));   ⑦
  24. world->addJoint(joint);   ⑧
  25. }

上面代码onTouchBegan函数是触摸响应函数,在onTouchBegan中调用addNewSpriteAtPosition函数。在addNewSpriteAtPosition中创建两个精灵,创建两个物体,并设置它们之间的关节约束。代码第①行创建精灵boxA,第②行设置它的位置。第③行代码PhysicsBody::createBox(boxA->getContentSize())是创建矩形盒子物体。第③行代码boxA->setPhysicsBody(boxABody) 是设置与精灵相关的物体对象。第⑤行是将精灵添加到当前层中。

创建完成boxA和boxABody,下面又紧接着创建了boxB 和boxBBody对象。创建好它们之后就可以进行添加关节约束了,第⑥行代码auto world = this->getScene()->getPhysicsWorld()是从场景中获得物理世界(PhysicsWorld)对象。第⑦行代码通过PhysicsJointDistance的静态函数construct创建距离关节对象,其中锚点坐标采用的模型坐标(本地坐标),如果获得的不是模型坐标,可以进行坐标转换。PhysicsBody中提供两个坐标转换函数:

Vec2 world2Local(const Vec2& point)。世界坐标转换为模型坐标。

Vec2 local2World(const Vec2& point)。模型坐标转换为世界坐标。

最后第⑧行代码world->addJoint(joint)语句是将创建关节添加到物理世界中。

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

欢迎关注智捷iOS课堂微信公共平台

实例介绍Cocos2d-x物理引擎:使用关节的更多相关文章

  1. Unity 物理引擎动力学关节

    Unity物理引擎中的各个动力学关节 Hinge Joint (铰链关节) Fixed Joint (固定关节) Spring Joint (弹簧关节) Character Joint(角色关节) C ...

  2. Cocos2d-x教程(30)-3.x版本号物理引擎的使用

    转载时请注明原文出处 : http://blog.csdn.net/u012945598/article/details/38417333 在Cocos2d-x 2.x的版本号中,开发人员能够直接使用 ...

  3. Cocos2d-x之物理引擎

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 在很多的游戏设计中一般都会涉及和模拟到真实的物理世界.然而游戏中模拟真实世界的物理会很复杂.使用已经写好的物理引擎会用很大的帮助和便利.  ...

  4. 基于APE物理引擎的管线容积率计算方法

    容积率一般应用在房地产开发中,是指用地范围内地上总建筑面积与项目总用地面积的比值,这个参数是衡量建设用地使用强度的一项非常重要的指标.在其他行业,容积率的计算也非常重要,如产品利用率.管道使用率等等. ...

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

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

  6. 实例介绍Cocos2d-x物理引擎:HelloPhysicsWorld

    我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用物理引擎的开发过程,熟悉这些API的使用.这个实例的运行后的场景,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点生成一个新的 ...

  7. 实例介绍Cocos2d-x中Box2D物理引擎:HelloBox2D

    我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用Box2D物理引擎的开发过程,熟悉这些API的使用.这个实例运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触 ...

  8. 实例介绍Cocos2d-x物理引擎:碰撞检测

    碰撞检测是使用物理引擎的一个重要目的,使用物理引擎可以进行精确的碰撞检测,而且执行的效率也很高.在Cocos2d-x 3.x中使用事件派发机制管理碰撞事件,EventListenerPhysicsCo ...

  9. 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测

    在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...

  10. 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检測

    在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...

随机推荐

  1. 配置DNS服务器IP

    #############################脚本功能及说明#################### #该脚本用来在本地服务器上配置DNS服务器IP #创建时间:2014-10-22 ## ...

  2. 启用MySQL查询缓存

    启用MySQL查询缓存能够极大地减低数据库server的CPU使用率,实际使用情况是:开启前CPU使用率120%左右,开启后降到了10%. 查看查询缓存情况: mysql> show varia ...

  3. DevExpress - cxGrid 使用方法

    如何设置多选,并对多个选中行进行数据处理. 1.首先需要将需要获取的字段的列添加到 Grid 中,例如 grdDemoColumn1. 2.将 Grid 的 OptionsSelection 中的 C ...

  4. C语言用static限制函数以及全局变量的作用域

    今天才发现这个东西! C语言中没有public private之类的东西. 如果一个函数或者一个全局变量只想在一个.c文件中使用,可以在前面加上static! 以前我还傻傻的每个.c文件中的函数都加一 ...

  5. Codeforces Gym 100425D D - Toll Road 找规律

    D - Toll RoadTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view ...

  6. Lua学习教程之 可变參数数据打包与解包

    利用table的pack与unpack进行数据打包与解包.測试代码例如以下: print("Test table.pack()----------------"); functio ...

  7. gcc中不同namespace中同名class冲突时

    正常情况下,编译器都会报错,提示你有两个候选类,让你明确的选择一个. 比如我的情况,我自己设计了一个类Message, 然后在某个文件里面引用了它.但是我的文件中又引入了mongodb的头文件,非常不 ...

  8. 免费的天气预报API--谷歌,雅虎,中央气象台

    Google Weather API 仅仅支持美国地区使用邮政编码进行查询,比如:  http://www.google.com/ig/api?hl=zh-cn&weather=94043  ...

  9. PHP下获取上个月、下个月、本月的日期(strtotime,date)

    今天写程序的时候,突然发现了很早以前写的获取月份天数的函数,经典的switch版,但是获得上月天数的时候,我只是把月份-1了,估计当时太困了吧,再看到有种毛骨悚然的感觉,本来是想再处理一下的,但是一想 ...

  10. [iOS 10 day by day] Day 1:开发 iMessage 的第三方插件

    本文介绍了 iOS 10 的一个重要更新:Messages 应用支持第三方插件了.作者用一个小游戏作为例子,说明了插件开发从建工程开始,到绘制界面.收发消息的全过程. <iOS 10 day b ...