Box2d初探

当使用cocos2d来为box2d创建一个world对象的时候。这个world对象管理物理仿真中的所有对象。

body definition, then a body object, then a shape, then a fixture definition, and finally a fixture object

一旦我们已经创建了这个world对象,接下来需要往里面加入一些body对象。body对象可以随意移动,可以是怪物或者飞镖什么的,只要是参与碰撞的游戏对象都要为之创建一个相应的body对象。当然,也可以创建一些静态的body对象,用来表示游戏中的台阶或者墙壁等不可以移动的物体。

为了创建一个body对象,你需要做很多事情–首先,创建一个body定义结构,然后是body对象,再指定一个shap,再是fixture定义,然后再创建一个fixture对象。下面会一个一个解释刚刚这些东西。

  • 你首先创建一个body定义结构体,用以指定body的初始属性,比如位置或者速度。

  • 一旦创建好body结构体后,你就可以调用world对象来创建一个body对象了。

  • 然后,你为body对象定义一个shape,用以指定你想要仿真的物体的几何形状。

  • 接着创建一个fixture定义,同时设置之前创建好的shape为fixture的一个属性,并且设置其它的属性,比如质量或者摩擦力。

  • 最后,你可以使用body对象来创建fixture对象,通过传入一个fixture的定义结构就可以了。

  • 请注意,你可以往单个body对象里面添加很多个fixture对象。这个功能在你创建特别复杂的对象的时候非常有用。比如自行车,你可能要创建2个轮子,车身等等,这些fixture可以用关节连接起来。

只要你把所有需要创建的body对象都创建好之后,box2d接下来就会接管工作,并且高效地进行物理仿真—只要你周期性地调用world对象的step函数就可以了。

但是,请注意,box2d仅仅是更新它内部模型对象的位置–如果你想让cocos2d里面的sprite的位置也更新,并且和物理仿真中的位置相同的话,那么你也需要周期性地更新精灵的位置。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

b2Vec2 gravity = b2Vec2(0.0f, 0.0f);

bool doSleep = false;

_world = new b2World(gravity, doSleep);



b2BodyDef spriteBodyDef;

spriteBodyDef.type = b2_dynamicBody;

spriteBodyDef.position.Set(sprite.position.x/PTM_RATIO,
sprite.position.y/PTM_RATIO);

spriteBodyDef.userData = sprite;

b2Body *spriteBody = _world->CreateBody(&spriteBodyDef);


b2PolygonShape spriteShape;

spriteShape.SetAsBox(sprite.contentSize.width/PTM_RATIO/2,
sprite.contentSize.height/PTM_RATIO/2);


b2FixtureDef spriteShapeDef;

spriteShapeDef.shape = &spriteShape;

spriteShapeDef.density = 10.0;

spriteShapeDef.isSensor = true;

spriteBody->CreateFixture(&spriteShapeDef);
文章目录
,