使用Box2D基本步骤
I) 创建一个world object( class b2World),这个world object将是Cocos2d中的用来管理其他所有对象和进行物理模拟的主要对象。
II)创建Body 这一步又分为一下几个步骤
1)创建一个body definition来制定body的初始属性,比如位置和速度
2)通过调用world object的方法并使用body definition来创建body object
3)创建一个shape来代表你想模拟的对象
4)创建一个Friction definition,并把
// Create a world
b2Vec2 gravity = b2Vec2(0.0f, 0.0f);
_world = new b2World(gravity);
// Do we want to let bodies sleep?
_world->SetAllowSleeping(true);
// Create edges around the entire screen
b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0,0);
_groundBody = _world->CreateBody(&groundBodyDef);
// Define the ground box shape.
b2EdgeShape groundBox;
// bottom
groundBox.Set(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO,0));
_groundBody->CreateFixture(&groundBox,0);
// top
groundBox.Set(b2Vec2(0,winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO,winSize.height/PTM_RATIO));
_groundBody->CreateFixture(&groundBox,0);
一个重要的话题:碰撞 (collision)
为了找到什么时候一个fixture跟另外一个fixture碰撞,我们需要注册一个contact listener。我们将Contact listener传给Box2D,当两个对象开始碰撞和结束碰撞时,它就会调用contact listener的方法。
两个注意事项:1)我们不能在callback里修改游戏中的物理。所以我们纪录下碰撞物体,稍后再处理它们
2)我们 不能纪录碰撞点的引用,因为它们会被重用。所以我们纪录它们的拷贝。
例程:
struct MyContact {
b2Fixture *fixtureA;
b2Fixture *fixtureB;
bool operator==(const MyContact& other) const
{
return (fixtureA == other.fixtureA) && (fixtureB == other.fixtureB);
}
};
class MyContactListener : public b2ContactListener {
public:
std::vector<MyContact>_contacts;
MyContactListener();
~MyContactListener();
virtual void BeginContact(b2Contact* contact);
virtual void EndContact(b2Contact* contact);
virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold);
virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse);
};