1.首先你需要创建body定义,指定物体的一些初始属性,如位置,或速度等。
代码如:
b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0,0);//指定物体的位置
注:在b2Body.h中可以看到,b2BodyDef是一个结构体,可以用它来指定物体的初始属性,如userData,position,angle,linearVelocity等等。具体的请参考b2Body.h文件。
2.一旦设置好物体定义,就可以使用世界对象来创建物体。
代码如:
_groundBody = _world->CreateBody(&groundBodyDef);
注意,用world对象来创建物体的时候,要使用之前创建的物体定义为参数。
在b2World.h文件中,该方法的定义如下:
3.然后需要为物体定义一个shape(形状),代表要仿真的物体的几何形状。
代码如:
b2PolygonShape groundBox;
groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO, 0));
注意:b2PolygonShape是继承自b2Shape的一个子类,SetAsEdge方法实际上是使用两个点来设置一条边界。具体请参考b2PolygonShape.h文件。
4.接下来需要创建一个fixture(夹具)的定义,在这一步需要将夹具定义的形状设置为刚刚所创建的形状,并设置一些其它的属性,如密度或摩擦力等。
代码如:
b2FixtureDef groundBoxDef;
groundBoxDef.shape = &groundBox;
注意:
b2FixtureDef也是一个结构体,可以用它来设置夹具的一些属性,如shape,userData,friction等等。
5.最后,使用物体对象来创建夹具对象。
_bottomFixture = _groundBody->CreateFixture(&groundBoxDef);
注意:在创建夹具对象的时候,必须以夹具定义作为参数。
6.特别需要注意的是,我们可以给单个物体添加多个夹具,当创建复杂对象的时候,这一点会很有用。实际上,在创建地面盒(沿着屏幕的不可见边界时),我们为_groundBody这个物体对象添加了4个夹具对象,分别是:
//两点分别是左下的(0,0)和屏幕最右下的(winSize.width/PTMRATIO,0),所以是底部夹具(地面)
groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO,0));
///左侧夹具
groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(0,winSize.height/PTM_RATIO));
///顶部夹具(天花板)
groundBox.SetAsEdge(b2Vec2(0,winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO,winSize.height/PTM_RATIO));
///右侧夹具
groundBox.SetAsEdge(b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO),b2Vec2(winSize.width/PTM_RATIO,0));