[原创]cocos2d-x研习录-第三阶 特性之物理引擎
游戏物理引擎是指在游戏中涉及物理现象的逻辑处理,它用于模拟现实世界的各种物理规律(如赛车碰撞、子弹飞行、物体掉落等),让玩家能够在游戏中有真实的体验。
Cocos2D-x中支持Box2D和Chipmunk两种第三方开源物理引擎。这两种物理引擎功能上没有本质的区别,只是Chipmunk是用C语言实现的,Box2D是用C++语言实现的。Box2D目前相对使用更为广泛,所以本节只了解Box2D物理引擎。
要学习Box2D物理引擎,我们先来了解一些Box2D中定义的重要概念,这些概念是构成Box2D世界的基础,它的重要性不言而喻。
·刚体(rigid body):不会发生形变的物体,其任何两点间的距离是不变的。
·形状(shape):依附于物体的二维的形状结构,具有摩擦和恢复的材料属性。
·约束(constraint):约束就是限制物体自由的物理连接。在二维中,物体有三个自由度,比如把一个物体固定在墙上,它只能绕着固定的点旋转,它失去了两个自由度。
·接触约束(contact constraint):自动创建的约束,防止刚体穿透、模拟摩擦和恢复的特殊约束,不需要手动创建。
·关节(joint):把两个物体固定在一起的约束,包括旋转、距离和棱柱等、关节可以支持限制和马达。
·关节马达(joint motor):一个关节马达依靠自由度来驱动物体,比如使用马达来驱动旋转。
·关节限制(joint limit):限制关节的运动范围如同人的胳膊只能在一定范围内运动一样。
·世界(world):物体、形状和约束互相作用形成的世界。允许创建多个世界。
我们这里就不去关注Box2D的实现,而重点放在Box2D在Coco2D-x中的使用。Box2D物理引擎的使用步骤大致如下:
1)创建一个物理世界,同时设置其参数;
2)创建刚体地面,定义一个形状,把它绑定在刚体上;
3)创建世界中的其他刚体和约束等;
4)在游戏的逻辑循环中加入物理引擎的世界更新函数。
整个过程的主要目的就是将负责渲染的Cocos2D-x引擎部分和负责物理逻辑的Box2D部分结合在一起。这也是在其他平台上使用Box2D时需要做的事情,其中创建刚体、约束和关节等是最关键的部分,也是和渲染的Cocos2D-x引擎部分结合的关键部分。
在Cocos2D-x中使用Box2D,主要是将Cocos2D-x中负责渲染的节点类对象和Box2D中负责物理模拟的对象"绑定"在一起,实现逻辑和渲染的模拟。
下面我们根据以上使用步骤,结合代码查看一下的使用方法。
b2Vec2 gravity; //定义物理世界的重力系统
gravity.Set(0.0f, -10.0f);//设置重力大小和方向
b2World* world = new b2World(gravity); //创建物理世界对象
world->SetAllowSleeping(true);//是否允许休眠
world->SetContinuousPhysics(true);
b2BodyDef groundBodyDef; //定义物体对象类型
groundBodyDef.position.Set(0, 0);
b2Body* groundBody = world->CreateBody(&groundBodyDef); //创建物体对象 //定义物体边界
b2EdgeShape groundBox;
groundBox.Set(b2Vec2(0,0), b2Vec2(s.width/PTM_RATIO,0));
groundBody->CreateFixture(&groundBox,0);
groundBox.Set(b2Vec2(0,s.height/PTM_RATIO), b2Vec2(s.width/PTM_RATIO,s.height/PTM_RATIO));
groundBody->CreateFixture(&groundBox,0);
groundBox.Set(b2Vec2(0,s.height/PTM_RATIO), b2Vec2(0,0));
groundBody->CreateFixture(&groundBox,0);
groundBox.Set(b2Vec2(s.width/PTM_RATIO,s.height/PTM_RATIO), b2Vec2(s.width/PTM_RATIO,0));
groundBody->CreateFixture(&groundBox,0);
以上代码完成了步骤1)和2),下面进入步骤3和4),这是将Box2D与Cocos2D结合在一起的关键部分,一起来看一看吧。
PhysicsSprite *sprite = new PhysicsSprite();
sprite->initWithTexture(m_pSpriteTexture, CCRectMake(32 * idx,32 * idy,32,32));
sprite->autorelease();
这里是创建一个精灵对象,这里物理精灵类PhysicsSprite是自定义类,它继承于CCSprite,定义它的作用就是将渲染精灵类与刚体对象绑定在一起。
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);
b2Body *body = world->CreateBody(&bodyDef);//定义物体边界
PolygonShape dynamicBox;
dynamicBox.SetAsBox(.5f, .5f);
b2FixtureDef fixtureDef;
fixtureDef.shape = &dynamicBox;
fixtureDef.density = 1.0f;
fixtureDef.friction = 0.3f;
body->CreateFixture(&fixtureDef);
sprite->setPhysicsBody(body);//将刚体添加到刚体精灵对象中
接下来就是Box2D的动画更新,它是在时间调度的update中更新动画的。最后,就是更新渲染方法,在自定义类PhysicsSprite中的nodeToParentTransform方法更新节点位置。
物理引擎的内容还有很多,这里只是抛砖引玉的介绍一下。
注:本人在本博客的原创文章采用创作共用版权协议(http://creativecommons.org/licenses/by-nc-sa/2.5/cn/), 要求署名、非商业用途和保持一致。要求署名包含注明我的网名及文章来源(我的博客地址:http://www.cnblogs.com/binbingg)。
[原创]cocos2d-x研习录-第三阶 特性之物理引擎的更多相关文章
- [原创]cocos2d-x研习录-第三阶 特性之粒子系统
我想接触过游戏引擎的同学,对粒子系统应该不会陌生.它用于解决由大量按一定规则运动(变化)的微小物质在计算机上的生成和显示问题.粒子系统在游戏中有着非常广泛的应用,可以模拟很多现象,如火花.爆炸.烟雾. ...
- [原创]cocos2d-x研习录-第三阶 特性之瓦片地图集
由于一张大的世界地图或背景图片往往可以由屈指可数的几种地形来表示,每种地形对应于一张小的图片,我们称这些小的地形图片为瓦片.把这些瓦片拼接在一起,组合成一个完整的地图,这就是瓦片地图集的基本原理. C ...
- [原创]cocos2d-x研习录-第三阶 特性之调度器
在游戏中,经常会周期执行一些检测.操作或更新一些数据等,我们称之为调度.Cocos2D-x中将调度封装为类CCScheduler,方便在游戏开发中使用.我们一起来学习一下,CCScheduler具有哪 ...
- [原创]cocos2d-x研习录-第三阶 特性之动作
在前面的Cocos2D-x的概念类中,我们了解到节点类CCNode.导演类CCDirector.场景类CCScene.布景层类CCLayer和精灵类CCSprite等,这些类都是构成游戏画面的基本元素 ...
- [原创]cocos2d-x研习录-第三阶 特性之按键与虚拟键盘
Cocos2D-x引擎支持按键事件,它能检测设备的键盘输入并处理相应的事件.而基于不同操作系统的移动设备,可供用户操作的按键数量和功能都存在差异. Cocos2D-x使用CCKeypadDeleg ...
- [原创]cocos2d-x研习录-第三阶 特性之加速度传感器
智能手机的游戏与应用中,也经常会用到加速传感器事件来丰富用户的体验,比如飞翔的企鹅(英文AirPenguin)游戏就是通过加速度传感器来控制角色的移动和跳跃方向.下面学习Cocos2D-x中如何使用加 ...
- [原创]cocos2d-x研习录-第三阶 特性之触屏
游戏跟视频最大的区别就是互动,而手游(基于智能手机)主要靠触摸屏幕.重力传感和虚拟键盘等方式实现互动.这里主要记录Cocos2D-x对玩家触屏操作的处理. 在Cocos2D-x中触屏分为单点触屏和多点 ...
- [原创]cocos2d-x研习录-第三阶 多分辨率适配器
在移动终端(智能手机)平台下开发游戏一般都会涉及到屏幕多分辨率适配问题,原因是手机款式多种多样,不同的款式存在有不同的尺寸,即使尺寸相同又可能存在不同的分辨率. 手机屏幕尺寸:指手机屏幕对角线长度. ...
- [原创]cocos2d-x研习录-第三阶 背景音乐和音效
在游戏中,音效是一个不可或缺的部分,它可以为我们的游戏增加效果.音效在游戏中一般分为长时间的背景音乐和短促的特效音乐.Cocos2D-x支持多种常见音乐格式(mp3.wav等). Cocos2D-x提 ...
随机推荐
- Oracle计算时间函数(对时间的加减numtodsinterval、numtoyminterval) (转)
原文来自:http://blog.itpub.net/756652/viewspace-697256/ 11g interval分区,按天分区,需要用到函数numtodsinterval. cre ...
- 关于升级xcode8
升级xcode8已是必然,升级ios10的用户不能说大有人在,应该也不会少,如果不升级xcode8,上架最新的包,那么可能应用在ios10 上是不支持的.so,这些xcode8的新特性,你应该了解!! ...
- 使用共享网卡的NAT模式配置VMware中的CentOS的上网功能
昨天写了一篇文章总结了前两天折腾VMware 10中的CentOS上网的问题,结果留下一下小瑕疵,就是视频教程中通过共享网卡使用NAT模式配置虚拟机的方法.今天在结合昨天的基础上终于弄明白了这个问题. ...
- Android开源框架:NineOldAndroid
在android3.0以前的版本,要实现动画,一般是使用NineOldAndroid开源框架,之后,就可以直接使用android提供的animation API了. 仔细看过此开源框架后,可看出此框架 ...
- 曲线参数化的Javascript实现(代码篇)
在曲线参数化的Javascript实现(理论篇)中推出了曲线弧长积分的公式,以及用二分法通过弧长s来查找样条曲线上对应的u,再求Q(u)的值.弧长积分函数如下: ,其中-----公式1 Simpson ...
- uboot(二): Uboot-arm-start.s分析
声明:该贴是通过参考其他人的帖子整理出来,从中我加深了对uboot的理解,我知道对其他人一定也是有很大的帮助,不敢私藏,如果里面的注释有什么错误请给我回复,我再加以修改.有些部分可能还没解释清楚,如果 ...
- SQL盲注之正则攻击
我们都已经知道,在MYSQL 5+中 information_schema库中存储了所有的 库名,表明以及字段名信息.故攻击方式如下: 1. 判断第一个表名的第一个字符是否是a-z中的字符,其中bli ...
- HTML标签整理
第一次接触动态网站的相关代码,对程序里HTML的标签不理解.在这里会把碰到的HTML标签整理出来,持续更新. 1.<form></form>:用于声明表单,定义采集数据的范围, ...
- BZOJ 3270 && BZOJ 1778 (期望DP && 高斯消元)
BZOJ 3270 :设置状态为Id(x,y)表示一人在x,一人在y这个状态的概率. 所以总共有n^2种状态. p[i]表示留在该点的概率,Out[i]=(1-p[i])/Degree[i]表示离开该 ...
- Eclipse Java class修改后的即时编译
通常情况下,修改了java文件,需要重启eclipse.但是myeclipse可以不用. 其实即时编译早就有了,通过简单配置javaRebel配置,可以达到修改java文件后不重启eclipse. 注 ...