1. 所需头文件
#include "Box2D/Box2D.h"
2. Box2D的一些概念
世界(Worlds),就是Box2D对物理世界的抽象。在抽象出来的结构体中可以设置加速度,调用物理模拟等功能。Box2D世界中的一切物体都由World创建(工厂方法)和销毁。这个"世界"被抽象为b2World结构体。
物体(Bodies),物体是对现实世界中的物品的抽象。它有线速度,角速度,位置等属性。注意这些属性都是些不可“感觉“的属性,可以把它想象成一个质心,没有大小,没有质量,没有密度。要将物体转成现实生活中的样子,我们需要使用定制器来定制它。物体被抽象为b2BodyDef结构体
定制器(Fixtures),定制器定制物体的大小,形状,材质,密度属性等,一个物体可以有多个定制器,我们可以用各种定制器来把物体弄成长得很像现实生活的物体,用来模拟它们的行为。定制器被抽象为b2FixtureDef结构体。
3. 代码
首先初始化我们需要的世界:
b2Vec2 gravity; gravity.Set(0.0f, -10.0f); //一个向下10单位的向量,作为重力减速度,Box2D中默认的单位是秒和米 mWorld = new b2World(gravity); // 创建一个有重力加速度的世界 b2BodyDef bodyDef; //一个物体的定义 bodyDef.type = b2_staticBody; //物体的类型,不动的,坚硬的~ 可以把这样的物体当成地面 b2PolygonShape borderShape; // 一个方形的形状 b2FixtureDef borderFixture; // 一个定制器 //定义地板 bodyDef.position.Set(0, 0); // 地板在0,0位置 borderShape.SetAsBox(VisibleRect::right().x * PTM_RATIO, 0); //设置长度和高度,这里描述的地板就像是X轴,是一条线 borderFixture.shape = &borderShape; b2Body * bottomBorder = mWorld->CreateBody(&bodyDef); //在世界中创建一个物体(地面) bottomBorder->CreateFixture(&borderFixture); //定制地面的形状
在这个世界中,只有一个小球,不断的落下,弹起,永远不会停止~~~
CCSprite * ball = CCSprite::create("CloseNormal.png"); //小球对应的精灵 ball->setAnchorPoint(ccp(0.5, 0.5)); ball->setPosition(VisibleRect::center()); this->addChild(ball); bodyDef.type = b2_dynamicBody; //小球是可以动的 bodyDef.userData = ball; //这只是为了保存数据,可以通过物体找到对应的精灵 bodyDef.linearDamping = 0.0f; //初速度为0 bodyDef.position.Set(ball->getPositionX() * PTM_RATIO, ball->getPositionY()* PTM_RATIO); //初始位置 mBallBody = mWorld->CreateBody(&bodyDef); // 在Box2D世界中创建一个物体 b2PolygonShape bodyShape; bodyShape.SetAsBox(20* PTM_RATIO, 20* PTM_RATIO); //小球的大小和形状~ 方形的???圆形的应该是b2CircleShape b2FixtureDef bodyFixture; //小球的定制器 bodyFixture.density = 1; // 密度 bodyFixture.shape = &bodyShape; //形状 bodyFixture.friction = 0.1f; //摩擦力,因为掉落过程中没有物体间的摩擦,所以没用 bodyFixture.restitution = 1.0f; //弹力,100%反弹~~~ mBallBody->CreateFixture(&bodyFixture);
cocos2dx中的物理引擎默认将一个像素认为是1m,极限速度是120m/s, 所以默认情况下的自由落体很容易变成匀速运动。这里我定义了一个常量PTM_RATIO,代表着像素与米的换算比例,每当有距离时,便做个换算,可以比较好的模拟一些运动情况。
5. 代码
https://github.com/shazi129/MyCocoDemo.git 中的/Classes/Box2DTest文件夹
<pre>