在游戏中我们可以通过关节约束两个物体的运动。我们通过一个距离关节实例,介绍一下如何在使用关节。
这个实例的运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点和附近生成两个新的精灵,它们的运行是*落体运动,它们之间的距离是固定的。图示是开启了绘制调试遮罩,从图中可见,调试遮罩不仅会显示物体,还会显示关节。
使用距离关节实例
使用距离关节实例(绘制调试遮罩)
代码部分中HelloWorldScene.h文件与上一节的实例非常类似,不再介绍了。HelloWorldScene.cpp中创建物理世界和指定世界的边界语句是在HelloWorld::createScene()和HelloWorld::init()函数中,这两个函数类似于上一节实例,这里也不再解释这些函数代码了。
HelloWorldScene.cpp中与使用关节的相关代码如下:
- bool HelloWorld::onTouchBegan(Touch* touch, Event* event)
- {
- Vec2 location = touch->getLocation();
- addNewSpriteAtPosition(location);
- return false;
- }
- void HelloWorld::addNewSpriteAtPosition(Vec2 p)
- {
- Size visibleSize = Director::getInstance()->getVisibleSize();
- Vec2 origin = Director::getInstance()->getVisibleOrigin();
- auto boxA = Sprite::create("BoxA2.png"); ①
- boxA->setPosition(origin+ p); ②
- auto boxABody = PhysicsBody::createBox(boxA->getContentSize()); ③
- boxA->setPhysicsBody(boxABody); ④
- addChild(boxA, 10, 100); ⑤
- auto boxB = Sprite::create("BoxB2.png");
- boxB->setPosition(origin + p + Vec2(0, -120));
- auto boxBBody = PhysicsBody::createBox(boxB->getContentSize());
- boxB->setPhysicsBody(boxBBody);
- addChild(boxB, 20, 101);
- auto world = this->getScene()->getPhysicsWorld(); ⑥
- PhysicsJointDistance* joint = PhysicsJointDistance::construct(boxABody, boxBBody,
- Vec2(0, 0), Vec2(0, boxB->getContentSize().width / 2)); ⑦
- world->addJoint(joint); ⑧
- }
上面代码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)语句是将创建关节添加到物理世界中。
欢迎关注智捷iOS课堂微信公共平台
实例介绍Cocos2d-x物理引擎:使用关节的更多相关文章
-
Unity 物理引擎动力学关节
Unity物理引擎中的各个动力学关节 Hinge Joint (铰链关节) Fixed Joint (固定关节) Spring Joint (弹簧关节) Character Joint(角色关节) C ...
-
Cocos2d-x教程(30)-3.x版本号物理引擎的使用
转载时请注明原文出处 : http://blog.csdn.net/u012945598/article/details/38417333 在Cocos2d-x 2.x的版本号中,开发人员能够直接使用 ...
-
Cocos2d-x之物理引擎
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 在很多的游戏设计中一般都会涉及和模拟到真实的物理世界.然而游戏中模拟真实世界的物理会很复杂.使用已经写好的物理引擎会用很大的帮助和便利. ...
-
基于APE物理引擎的管线容积率计算方法
容积率一般应用在房地产开发中,是指用地范围内地上总建筑面积与项目总用地面积的比值,这个参数是衡量建设用地使用强度的一项非常重要的指标.在其他行业,容积率的计算也非常重要,如产品利用率.管道使用率等等. ...
-
实例介绍Cocos2d-x中Box2D物理引擎:使用关节
下面我们将使用Box2D物理引擎技术进行重构.使得关节能够掌握如何在Box2D使用关节约束.HelloWorldScene.cpp中与使用关节的相关代码如下: void HelloWorld::add ...
-
实例介绍Cocos2d-x物理引擎:HelloPhysicsWorld
我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用物理引擎的开发过程,熟悉这些API的使用.这个实例的运行后的场景,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点生成一个新的 ...
-
实例介绍Cocos2d-x中Box2D物理引擎:HelloBox2D
我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用Box2D物理引擎的开发过程,熟悉这些API的使用.这个实例运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触 ...
-
实例介绍Cocos2d-x物理引擎:碰撞检测
碰撞检测是使用物理引擎的一个重要目的,使用物理引擎可以进行精确的碰撞检测,而且执行的效率也很高.在Cocos2d-x 3.x中使用事件派发机制管理碰撞事件,EventListenerPhysicsCo ...
-
实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测
在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...
-
实例介绍Cocos2d-x中Box2D物理引擎:碰撞检測
在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...
随机推荐
-
UDP 打洞 原理解释
终于找到了一份满意的UDP打洞原理解释,附上正文,自己整理了一下源码 3.3. UDP hole punching UDP打洞技术 The third technique, and the one o ...
-
asp.net get App_Data 目录几种方法 path
方法一 //ASP.NET MVC1 -> MVC3 string path = HttpContext.Current.Server.MapPath("~/App_Data/some ...
-
利用column-width属性设置多栏布局
css样式设置为: div{ background:blanchedalmond; margin:0 auto; width:1230px; -moz-column-width:400px; -web ...
-
Wamp集成环境安装
一.Wamp下载 点我下载WampServer2.1a-x32 二.Wamp安装步骤 三.修改语言为汉语 四.查看测试页面
-
[GitPython]使用python管理你的git库
你想使用python来自动管理一个git仓库的时候,GitPython是一个不错的选择. 简介: 先看看下面这段代码: from git import Repo repo = Repo("~ ...
-
Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)
原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了mat ...
-
Service,测试
这里介绍一些symfony的一些其他内容 1.创建并使用自定义service 首先创建service目录,在下面自定义一个类,并设置测试方法,之后在resources目录下面的services.xml ...
-
ORA-28040: No matching authentication protocol
1.2 前言部分 1.2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 告警日志中频繁出现Using depr ...
-
ES3之cookie
一 cookie的作用域由文档源(domain)和文档路径(path)决定. 当前页面的脚本只能操作:当前源的当前路径的cookie.当前源的父路径的cookie. 向服务器发送请求时,请求头(Req ...
-
Liunjx 文件
cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 1.命令格式: cat [选项] [文件] ...