您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d 中 Box2D 使用笔记

2012-01-31 00:14 274 查看
使用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);

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: