cocos2d-x 物理引擎BOX2d學習

小滿(bill man)個人原創,歡迎轉載,轉載請註明地址,小滿(bill man)的專欄地址http://blog.csdn.net/bill_man

在遊戲中我們經常要加入物理碰撞等和物理有關的內容,在遊戲中加入物理引擎可以使我們的遊戲更加真實,爲玩家展示一個更真實的世界,cocos2d-x支持兩個物理引擎Box2dChipmunk,本文介紹box2d

Box2D 是用可移植的 C++ 來寫成的。引擎中定義的大部分類型都有 b2 前綴,可以把它和我們遊戲中的其他元素區分開來。

Box2d中有很多概念。

1.剛體

  即是物理學中的質點,只有位置,沒有大小,它又可以區分爲以下幾類

  靜態剛體:靜態剛體沒有質量,沒有速度,只可以手動來改變他的位置

  棱柱剛體:棱柱剛體沒有質量,但是可以有速度,可以自己更新位置

  動態剛體:動態剛體有質量也有速度

物理引擎需要首先定義一個描述類,然後再根據描述類通過世界創建某個對象。創建剛體時需要有兩個步驟,一是生成一個剛體定義,二是根據剛體定義生成剛體。在剛體創建時定義中的信息會被複制,也就是說創建完成後剛體只要沒被釋放掉,就還可以重複使用。

//定義剛體

b2BodyDef groundBodyDef;

groundBodyDef.position.Set(screenSize.width/2/PTM_RATIO, screenSize.height/2/PTM_RATIO);

//生成剛體

b2Body* groundBody = world->CreateBody(&groundBodyDef);

2.形狀

  通過關聯添加到剛體上,碰撞可以根據形狀來判定,具有摩擦和恢復等材料特性。

b2PolygonShape groundBox;

// bottom

groundBox.SetAsBox(screenSize.width/2/PTM_RATIO, 0, b2Vec2(0, -screenSize.height/2/PTM_RATIO), 0);

3.關聯

關聯是一種附加在剛體上的屬性,一個剛體可以有多個關聯,創建關聯時,需要定義關聯的信息,然後通過剛體創建關聯,當關聯被創建時關聯定義中的信息也會被保留,也可以重用

//定義並創建關聯

b2FixtureDef fixtureDef;

fixtureDef.shape = &dynamicBox;

fixtureDef.density = 1.0f;

fixtureDef.friction = 0.3f;

body->CreateFixture(&fixtureDef);

4.鏈接

鏈接可以聯繫多個缸體,使得剛體之間相互影響,同樣的,也需要首先定義信息,之後通過世界創建鏈接,同樣的,信息也可以被保留,從而重用

另外鏈接還支持限制和馬達,限制就是限制物體運動的角度,馬達就是依照關節中的限制來約束物體

鏈接有旋轉,棱柱和距離等

b2RevoluteJointDef rjd;

rjd.Initialize(m_attachment, m_platform, b2Vec2(0.0f, 5.0f));

rjd.maxMotorTorque = 50.0f;

rjd.enableMotor = true;

m_world->CreateJoint(&rjd);

5.約束

  一個約束就是消除物體自由度的物理連接。在 2D 中,一個物體有 3 個自由度。如果我

們把一個物體釘在牆上(像擺錘那樣),那我們就把它約束到了牆上。這樣,此物體就只能繞着這個釘子旋轉,所以這個約束消除了它 2 個自由度。

還有一種不須你創建的接觸約束,一個防止剛體穿透,以及用於模擬摩擦和恢復的特殊約束。

6.世界

  世界是遵循物理的空間,以上的所有都存在於世界中,可以創建多個世界,但很少這樣用

創建世界需要兩個步驟,一是生成重力向量,二是根據重力生成世界對象

//生成重力向量

b2Vec2 gravity;

gravity.Set(0.0f, -10.0f);

//生成世界對象

bool doSleep = true;

world = new b2World(gravity);

world->SetAllowSleeping(doSleep);

world->SetContinuousPhysics(true);

剛開始研究此引擎,如有錯誤之處,希望大家多多指正

下一篇繼續深入box2d

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章