先介绍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简单的使用是需要经过下面四个步骤:
- 创建物理世界
- 在物理世界里面加入刚体
- 模拟步进计算
- 获取模拟后的坐标和弧度
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