先介绍box2d基础,再和cocos2d-x结合应用,最后给利用PhysicsEditor工具导出的数据,水果从上面掉下来的例子。

Box2d基本概念

Box2D是一个用于游戏的2D刚体仿真库。程序员可以使用它在他们的游戏使物体在现实的方式,让游戏世界更生动。就是说它只是数据计算,比如两个物体的碰撞,它会告诉程序员,至于你两个物体是怎么的显示,那是渲染的事。

  • shape :2D 的几何对象,如:圆形或者对变形
  • rigid body:刚体,也就我们用到的物体,有动态和静态刚体。
  • fixture:夹具,它是绑定在body,它包含有,shape ,密度,摩擦系数,碰撞过滤。
  • constraint:约束,比如摆钟,你绕着那一点来摆。
  • contact constraint:一种特殊的约束,比你的不能穿透另外个刚体,和模拟摩擦及恢复形状。
  • joint:用来约束两个或者更多的body,支持多种节点类型:revolute, prismatic, distance等。
  • joint limit:
  • joint motor:
  • world:物理世界,是body,fixture,constraint集和到一起。box2d支持创建多个word,但何必。
  • solver:
  • continuous collision :

Box2d的简单使用

box2d简单的使用是需要经过下面四个步骤:

  1. 创建物理世界
  2. 在物理世界里面加入刚体
  3. 模拟步进计算
  4. 获取模拟后的坐标和弧度

box2d HelloWorld

 //创建物理世界
 b2Vec2 gravity(0.0f, -10.0f);
 b2World world(gravity);

//定义创建刚体
 b2BodyDef bodyDef;
 bodyDef.type = b2_dynamicBody;
 bodyDef.position.Set(0.0f, 4.0f);
 b2Body* body = world.CreateBody(&bodyDef);
 b2PolygonShape dynamicBox;
 dynamicBox.SetAsBox(1.0f, 1.0f);
//定义夹具 形状等,附加刚体上
 b2FixtureDef fixtureDef;
 fixtureDef.shape = &dynamicBox;
 fixtureDef.density = 1.0f;
 fixtureDef.friction = 0.3f;
 body->CreateFixture(&fixtureDef);

//模拟步进
 float32 timeStep = 1.0f / 60.0f;
 int32 velocityIterations = 6;
 int32 positionIterations = 2;
 world.Step(timeStep, velocityIterations, positionIterations);

//获取box2d模拟后的数据包括坐标和弧度
 b2Vec2 position = body->GetPosition();
 float32 angle = body->GetAngle();

box2d和 cocos2d-x应用

建议使用cocos2d-x 3.5以上。

文件说明:

  • GLES-Render:用显示box2d调试数据
  • GB2ShapeCache-x:解析PhysicsEditor导出的box2d数据,原来的版本是2.X的,已经修改过适应3.X的版本
  • HelloWorldScene:场景

PhysicsEditor使用:

官网有教程,就不在写了。记得导出的时候选择cocos plist格式,当然如果你导出其他的格式,就自己对应的解析。

注意事项:

  • box2d单位和像素是1:30,即是box2d一单位等于30像素。
  • box2d弧度和cocos2d-x弧度是要反的。
  • 注意设置他们锚点(setAnchorPoint);

总结

例子里面只是写刚体的创建,一直在增加,并没有销毁刚体,在一些游戏当中,比如你打中了,销毁掉自身,就需要调用world->DestroyBody(body),同样上面没有说到相互直接的碰撞过滤,等等,。。但是不在本文目的范围之内,呵呵。。。。。。

例子下载图及参考

下载地址:http://pan.baidu.com/s/1pJ1JhVH

box2d的英文手册: http://box2d.org/manual.pdf

《Box2d在cocos2d-x应用》