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中都保存精灵对象的指针,不要一个保存精灵对象的指针,一个保存图层对象的指针。

 

0 0