1. 程式人生 > >cocos2d-x box2d 簡單物體(一)

cocos2d-x box2d 簡單物體(一)

box2d的物理世界有一個world來維護,可以建立簡單的物體,圓形,矩形,三角形,多邊形。多邊形只支援凸多邊形,最多8個頂點。

box2d的物體有三種:動態物體(dynamic),靜態物體(static),運動學物體(kinematic)。

動態物體可以受力,可以碰撞,可以移動。

靜態物體不可以移動,不受力,不能移動,可以參與碰撞。

運動學物體類似靜態物體,但是它可以被移動。

建立一個物體有三個步驟,

1.一個物體的body定義b2BodyDef,這個結構體描述了物體的型別,位置座標,角度,速度等。

2.用b2BodyDef建立一個body。

3.有了body,你還看不到這個物體,還需要定義形狀。這個形狀又是通過一個叫夾具的東西(fixtures)來加到物體上的。

    // body def
    b2BodyDef bDef;
    bDef.type = b2_dynamicBody;
    bDef.position = b2Vec2(visibleSize.width / 2 / RATIO + 5, visibleSize.height / 2 / RATIO);
    // body
    b2Body * birdBody = world->CreateBody(&bDef);
    
    // shape
    b2PolygonShape birdShap;
    CCSize size = bird->getContentSize();
    birdShap.SetAsBox((65) / 2 / RATIO, (65) / 2 / RATIO, b2Vec2(45 / 2 / RATIO, 27 / 2 / RATIO), 0);
    // fixtures
    b2FixtureDef birdFixtureDef;
    birdFixtureDef.shape = &birdShap;
    // fix to body
    birdBody->CreateFixture(&birdFixtureDef);

將精靈繫結到物體上:

一個精靈繫結到物體上,是在物體的body定義b2BodyDef裡面設定的,

        role = CCSprite::create("poop_1.png");
        bodyDef.userData = role;

但是如果只這樣是不夠的,你會發現精靈和物體會分開,不會一起移動。這還需要根據物體的位置改變精靈的座標,具體可以看上篇程式碼的update函式。

官方有一個B2Sprite的類,把精靈和body綁在一起了,後面我把這個類在補充一下,用起來就方便一點了,不用去定義一大堆的東西。