cocos2dx物理引擎和碰撞检测(一)
来源:互联网 发布:一加手机3怎么备份数据 编辑:程序博客网 时间:2024/05/01 05:16
废话不多说 直接进入正题!
大家都知道cocos2dx引擎配备的物理引擎Box2D,所以我们现在就开始学习它吧。
如果从游戏的角度来看,物理引擎只是个实时性的动画系统。游戏中存在两种制作动画方式:
(1)静态动画,可称为数据性动画,是指预先准备好动画所需的数据,比如cocos2dx引擎中的动画动作,就是事先准备了动画帧,再逐个播放。
(2)动态动画,可称为实时性动画,是指动态计算出动画所需的数据,根据数据再进行绘图。Box2D引擎就是会动态的计算物理位置,然后再绘制出来。
Box2D物理引擎可以创建的物理世界具备下面3个特点:
(1)物理世界中存在一个重力(可为零)
(2)物理世界可以是一个存在边界的范围(有碰撞效果)
(3)在世界中加入静态和动态物体(具备质量和位置)。它们被用来模拟现实的运动规律
下面对Box2D物理引擎进行一个大体的认识:
1.物理世界(world)
2.刚体(Rigid Bodies)
3.形状(shapes)依附于框架的2D平面几何图形。主要用于物理碰撞的检测
4.框架(Fixtures)是连接物体和形状之间的框架。一个物体可以有多个框架,每个框架可以连接一个形状。它本身存储着物体的质量、密度、摩擦系数,它主要是为了物理引擎的运算考虑
5.关节(Joints)将两个有一定运动自由度(水平、数值、转动)的物体连接起来,具有2个属性:
(1)关节限制:限定了一个关节的运动范围
(2)关节马达:依照关节的自由度来驱动所连接的物体
内存管理机制:
Box2D引擎当中存在一个小型的对象分配器(SOA),命名为b2BlockAllocator。SOA维护了一些不定尺寸并可扩展的内存池。当产生内存分配请求时,SOA会返回一块大小最匹配的内存。当内存块释放之后,他会被回收到池中。这样就可以很有效的提高引擎的运行性能。但是由于Box2D引擎中应用了SOA技术,所以开发展永远也不应该去独立创建一个物体、框架或者关节。那么问题来了,不让创建对象,还怎么使用物理引擎呢?
除了创建之外,开发者可以利用物理世界b2World的对象来分配上述对象。物理世界中提供了创建物体、框架和关节的工厂(factory)。这样做的好处在于使得Box2D引擎并将实现的细节隐藏起来。开发者只需要通过调用简单的函数就可以创建对象,而无需关系内部的细节。
工厂模式:
由于Box2D的内存管理机制,开发者想要创建一个物体b2Body、框架b2Fixture或者关节b2Joint的对象时,就必须调用b2World的工厂函数(factory functions)。工厂模式是来自面向对象编程语言的一种设计模式,是一种有效的对象管理机制。在工厂模式中,所有的对象从出生和消亡都是由工厂类来负责的,它只能创建几种特定的对象。在Box2D引擎中工厂类则是用来创建物体、框架和关节的。下面是创建函数:
//创建物体函数b2Body* b2World::CreateBody(constb2BodyDef* def)//创建框架函数b2Fixture* b2Body::CreateFixture(constb2FixtureDef* def)//创建关节函数b2Joint* b2World::CreateJoint(constb2JointDef* def)销毁函数://释放物体函数void b2World::DestroyBody(b2Body *body)//释放框架函数void b2Body::DestroyFixtrue(b2Fixtrue* fixtrue)//释放关节函数void b2World::DestroyJoint(b2Joint* joint)
数据单位:
Box2d引擎是使用浮点数来进行计算的,其数据单位并不是像素。而我们游戏绘制世界使用的数据单位是像素,那么就存在一个单位转换的问题;一般解决办法是定义一个转换率PIM_RATIO,单位是“像素/米”,以便把物体尺度在cocos2dx和Box2D相互转换。在很多游戏中PIM_RATIO=32。
用户数据:
用户数据是用来连接游戏世界和物理世界的方式,举个例子《愤怒的小鸟》小鸟身上有刚体,并在刚体中添加角色的用户数据,这样构成一个循环引用。如果持有角色就能得到刚体,有刚体就能得到角色。用户数据是可选的,可以放入任何东西,但是要确保一致性。例如如果想在物体中保存精灵对象的指针,那就应该在所有的物体body中都保存精灵对象的指针,不要一个保存精灵对象的指针,一个保存图层对象的指针。
- cocos2dx物理引擎和碰撞检测(一)
- cocos2dx物理引擎和碰撞检测(二)
- cocos2dx物理引擎和碰撞检测(三)
- cocos2dx物理引擎和碰撞检测(四)形状Shapes
- cocos2dx物理引擎和碰撞检测(五)框架Fixtures
- cocos2dx物理引擎和碰撞检测(六)物体Bodies
- cocos2dx物理引擎和碰撞检测(七)关节(Joints)
- cocos2dx物理引擎和碰撞检测(八)接触(Contants)
- Cocos2dx物理引擎碰撞检测总结
- 关于碰撞检测和物理引擎
- cocos2dx 3.x 物理引擎接触检测掩码、碰撞掩码和类别掩码问题解析
- 使用cocos2d-x3.0和物理引擎实现碰撞检测
- cocos2dx physics物理引擎碰撞详解
- Cocos2dx 物理碰撞检测的使用方法
- Unity3D物理引擎和碰撞
- Box2d物理引擎:b2ContactListener类碰撞检测
- 使用物理引擎进行碰撞检测
- 使用物理引擎进行碰撞检测
- Ubuntu下hustoj安装的步骤
- 王立平--自定义TitleBar
- 使用Minify来优化网站性能
- 【Android】ListView与Button的共存问题解决
- 函数指针和指针函数的区别
- cocos2dx物理引擎和碰撞检测(一)
- 数据结构 第三章 栈和队列
- codevs 1365 浴火银河星际跳跃 题解
- cmd中编译java文件
- 了解javascript中的apply和call
- Java 堆内存
- StrStrI 与 strstr
- HDU 2570 迷障 贪心
- In App Purchases(IAP 应用程序內购买): 完全攻略