cocos2d-x box2d 簡單物體(一)
阿新 • • 發佈:2019-02-07
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綁在一起了,後面我把這個類在補充一下,用起來就方便一點了,不用去定義一大堆的東西。