工作中需要用到cocos2dx box2d。记录下流程,按程序需求来整理。

Box2d的计量单位是米,32像素 = 1米

b2World:

每个box2d程序都会从b2World对象的创建开始。这是一个管理内存、对象,模拟物理的中心。创建world的必要参数就是重力。

b2World 的构造函数。 b2World(const b2Vec2& gravity);  
重要的成员如下

// 设置是否允许休眠,休眠指当物体静止不动时,不进行模拟计算。

void b2World::SetAllowSleeping(bool flag)

// 设置检查连续的物理碰撞
void SetContinuousPhysics(bool flag) { m_continuousPhysics = flag; }

// 根据b2BodyDef创建一个刚体对象

b2Body* b2World::CreateBody(const b2BodyDef* def)

// 在游戏循环里手动调用Step。第一个参数是上次调用本函数与当前的时间差,单位秒

// 2参数是速度迭代,可调整物体的运动,3参数是位置迭代,调整物体位置,减少物体间重叠

// 2、3参数官方文档推荐使用8和3

void b2World::Step(float32 dt, int32 velocityIterations, int32 positionIterations)

b2BodyDef:

刚体的定义,其对象作为参数传给b2World 的 CreateBody() 函数。就能创建实际的刚体对象。

b2Body:

Box2D中的刚体。刚体不能自己创建,必须由 CreateBody() 创建。刚体创建完毕后,需要通过
b2Fixture* b2Body::CreateFixture(const b2FixtureDef* def)   给他绑定包围盒。看参数就知道和b2Body一个尿性,必须由Def来创建。每调用一次 CreateFixture() 都会新增一个fixture,不会覆盖上一个fixture。

 

b2FixtureDef:

fixture---固定装置。有的资料翻译为“夹具”,其实就是body的实际碰撞体。这个Def相当重要。参数 shape 表示fixture的外形。类型是 const b2Shape* shape; Box2D提供4种shape如下图

chain 链状:由线段序列组成,具有双面碰撞,

circle 圆形:实心的。


edge: 边形状,由多条线段组成,只能和圆形、多边形碰撞,因为Box2D碰撞必须有体积。


polygon 凸多边形:默认最多八条边,为了方便起见,系统提供了函数 SetAsBox 直接可以设置矩形包围盒。



 


 


配置:cocos2d3版本默认是不带Box2D的,因此需要配置一下


1、增加Box2D项目。在解决方案上右键---添加已有项---定位到自己项目cocos目录下的Box2D项目。

 2、右键解决方案,属性---项目依赖项,把libBox2D选中。如果不选,只能在Box2D项目上点右键编译,选中后能省去以后不少麻烦。

3、在项目的头文件中添加

 


ok,到此为止,在项目里可以正常使用Box2D了。



很多Box2D演示都有绿色或红色的物体来表示碰撞,是因为开启了 debugDraw。cocos里要开启,需要去Test里找一个叫GLES-Render 的文件

拷贝到自己的项目里并添加。在使用的地方include头文件就ok。下面是一个Box2D 程序的简单流程


1、头文件内声明必要的变量和函数

2、在初始化的地方创建world和body对象 

3、绘制、更新