cocos2dx box2d入门

2015年03月10日 14:47 0 点赞 0 评论 更新于 2017-05-09 01:43

在工作中,有时会需要使用Cocos2d-x与Box2D相结合的技术。本文将详细记录使用流程,并按照程序需求进行整理。

一、Box2D的计量单位

Box2D使用的计量单位是米,其换算关系为32像素 = 1米。在进行开发时,需要注意这种单位换算,以确保物理模拟的准确性。

二、Box2D核心类介绍

1. b2World

每个Box2D程序都始于b2World对象的创建。b2World是管理内存、对象以及模拟物理的核心类。创建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函数。第一个参数dt是上次调用本函数与当前的时间差,单位为秒;第二个参数velocityIterations是速度迭代次数,可调整物体的运动;第三个参数positionIterations是位置迭代次数,用于调整物体位置,减少物体间的重叠。官方文档推荐velocityIterationspositionIterations分别使用8和3。
    void b2World::Step(float32 dt, int32 velocityIterations, int32 positionIterations);
    

2. b2BodyDef

b2BodyDef是刚体的定义类,其对象作为参数传递给b2WorldCreateBody()函数,从而创建实际的刚体对象。

3. b2Body

b2Body是Box2D中的刚体类。刚体不能直接创建,必须通过b2WorldCreateBody()函数来创建。刚体创建完成后,需要通过CreateFixture()函数为其绑定包围盒。

b2Fixture* b2Body::CreateFixture(const b2FixtureDef* def);

每次调用CreateFixture()函数都会新增一个fixture,不会覆盖上一个fixture

4. b2FixtureDef

b2FixtureDef表示固定装置,有的资料将其翻译为“夹具”,实际上它是刚体的实际碰撞体。该类的shape参数表示fixture的外形,类型为const b2Shape* shape。Box2D提供了4种shape

  • chain(链状):由线段序列组成,具有双面碰撞特性。
  • circle(圆形):实心圆形。
  • edge(边形状):由多条线段组成,只能和圆形、多边形碰撞,因为Box2D的碰撞检测要求物体必须有体积。
  • polygon(凸多边形):默认最多八条边。为了方便使用,系统提供了SetAsBox函数,可直接设置矩形包围盒。

三、Cocos2d-x 3.x版本配置Box2D

Cocos2d-x 3.x版本默认不包含Box2D,因此需要进行以下配置:

  1. 添加Box2D项目:在解决方案上右键,选择“添加” - “已有项”,然后定位到自己项目cocos目录下的Box2D项目。
  2. 设置项目依赖项:右键解决方案,选择“属性” - “项目依赖项”,选中libBox2D。如果不选中,只能在Box2D项目上点右键编译,选中后可避免后续的一些麻烦。
  3. 添加头文件:在项目的头文件中添加相关内容。

完成以上步骤后,就可以在项目中正常使用Box2D了。

四、开启DebugDraw

很多Box2D演示中会使用绿色或红色的物体来表示碰撞,这是因为开启了DebugDraw功能。在Cocos2d-x中开启该功能,需要从Test目录中找到GLES-Render文件,将其拷贝到自己的项目中并添加,然后在使用的地方包含该头文件即可。

五、Box2D程序简单流程

  1. 头文件声明:在头文件内声明必要的变量和函数。
  2. 初始化:在初始化的地方创建worldbody对象。
  3. 绘制与更新:进行绘制和更新操作。

通过以上步骤,你可以初步入门Cocos2d-x与Box2D的结合开发。在实际开发中,还需要根据具体需求深入学习和调整。

作者信息

boke

boke

共发布了 1025 篇文章