Cocos2d 中 Box2D 使用笔记

使用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);
 
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值