瘸腿蛤蟆笔记30-cocos2d-x-3.2 Box2d物理引擎Body类介绍

欢迎转载,转载标明出处:http://blog.csdn.net/notbaron/article/details/38615603

上篇回顾

本篇名言:啊!到达人生的尽头,才发现自己没活过。[梭罗]

上篇中,我们学习了(上篇其实撒也没干基本上)Box2d物理引擎的三大模块之一的dynamics模块,该模块包含了大量的类。

接下去蛤蟆正式开始学习其中dynamics模块中的类,这次咱们学习body这个类。。

 

理论介绍

         总体介绍:

Ok,body具有位置和速度。我们可以将力、力矩和冲量加给Body.Body可以是静态、动态和运动的(动态和运动是不是一样的?额,好吧,其实是不一样的)。静态的Body,就好比有无穷大质量,不好意思谁也挪不动,就没有速度了,不过我们可以手动移动它的,静态的Body不会和静态或者运动的Body发生碰撞。运动的Body,是具有速度的,说白了就是一块无穷重的物体在挪动,不会对外力做出反应的,可以通过用户挪动,但是通常是它自己的速度进行变化的,也不会和其他静态或者运动的Body发生碰撞。动态的Body,是会对外力做出反应的,具有非零质量,可以和任何body发生碰撞。

         Body是fixture(shapes)的骨干。绑定到Body上fixture,会被Body带着移动。通过Body是刚体,所以绑定到Body上的2个fixture就永远不会有相对运动了。

         Fixture有几何和密度。通常Body通过Fixtur获得质量。

 

Body定义

         我们创建Body之前,必须创建一个Body定义就是b2BodyDef.这个b2BodyDef包含了创建Body所需要的所有数据。创建的Body的时候,会将b2BodDef的数据复制过去,所以我们可以复用一个b2BodyDef。

         我们来看下Body定义了哪些关键的信息:

         Body 类型

分为三类static,kinematic, 和dynamic. 我们最后在开始就区分好Body类型,因为后期区分会非常的麻烦。       例如:bodyDef.type= b2_dynamicBody;

         位置和角度

         Body有两个关键的点。一个是Body的起点,Fixture和Joints是通过起点来附属到Body上的。还有一个是质心位置,这个位置根据附属Shape的质量分布或者通过b2MassData.显示设置的。Box2d内部的很多计算都是使用质心的。当我们创建完Body的定义后,我们不知道质心是在哪里的。所以我们需要定义一个起点,通常也定义一个角度。这两个是不受质心影响的。当我们改变Body的质量后,质心会发生变化,但是位置以及附属的shape,joints都不会改变。

         阻尼

         阻尼是用来改变Body速度的。它不同于摩擦,因为摩擦是需要2个Body接触产生的(不过阻尼其实就是和空气接触,是和空气的摩擦嘛)。阻尼和摩擦是可以一起作用的。阻力的值可以设置0到无穷大。

         重力

         重力用来调整单个body。

         睡眠参数

         因为仿真非系统资源的嘛,所以没事的时候咱们就让没什么变化的Body一边睡觉去。当然,如果被碰撞,或者Body上的fixture或者joint被删除都会唤醒Body的(就是嘛,睡觉的时候被撞,衣服被扒了,肯定会醒的嘛)。我们也可以手动唤醒之的。

         固定旋转

         有时候我们需要一个刚体,可能不想让他受到一个力矩的时候发生旋转。我们就可以设置这个参数固定之。

         子弹

         默认的Box2d使用CCD(Continuous collisiondetection,连续碰撞检测)来避免动态Body穿过静态Body。一般情况下是不适用CCD的,因为会影响性能。但是当有高速物理的时候就需要了,防止那些高速的子弹穿过砖头。在Box2d中可以将高速移动的物体标记为子弹,那么它就会使用CCD了,是不是很方便,定义如下:bodyDef.bullet = true;当然是对动态的body有效。

 

激活

         有时候我们需要Body创建之后不参数碰撞。类似与睡眠状态,但是又不会被碰撞唤醒(蛤蟆觉得应该是武侠中的假死状态)。需要注意的是激活一个Body的代价和创建一个Body一样。

 

用户数据

         用户数据是一个空指针,可以将应用对象链接到Body上。

        

Body工厂

         学完Body定义,我们来看下如何创建Body。

b2Body* dynamicBody = myWorld->CreateBody(&bodyDef);//通过World创建一个Body

... do stuff ..//这里就是对Body的处理,略过

myWorld->DestroyBody(dynamicBody);//删除Body

dynamicBody = NULL;//指针赋NULL

         如果我们删除整个物理世界,那么就不要清理指针的了。

         当摧毁一个Body 时,附属在上面的fixture和joints也就一并销毁了。

 

使用Body

         创建Body之后,可以有很多操作来针对Body。包括设置质量属性,访问位置,访问速度,施加作用力,改变坐标和向量。

         对于一个Body它拥有质量,质心,转动惯量等。

         静态的Body 质量和转动惯量为0。此外当一个Body固定旋转时,其转动惯量也是0。

         设置质量大小:voidSetMassData(const b2MassData* data);

         如何获取Body的信息呢?可以如下操作:

void SetType(b2BodyType type);//设置Body类型

b2BodyType GetType();//获取Body类型

void SetBullet(bool flag);

bool IsBullet() const; //是否为子弹类型

void SetSleepingAllowed(bool flag);

bool IsSleepingAllowed() const; //是否允许睡眠

void SetAwake(bool flag);

bool IsAwake() const; //是否被唤醒了

void SetActive(bool flag);

bool IsActive() const; //是否被激活了

void SetFixedRotation(bool flag);

bool IsFixedRotation() const; //是否固定了旋转

         通过以上我们可以获取绝大多数Body的状态了。这些状态也是我们在定义的时候设置的有木有?      

        

总结

         本次蛤蟆学习了dynamcis模块中的body类,不知道小伙伴们有没有收获哈。接着蛤蟆学习Fixtures类。

你可能感兴趣的:(瘸腿蛤蟆笔记30-cocos2d-x-3.2 Box2d物理引擎Body类介绍)