小滿(bill man)個人原創,歡迎轉載,轉載請註明地址,小滿(bill man)的專欄地址http://blog.csdn.net/bill_man
在遊戲中我們經常要加入物理碰撞等和物理有關的內容,在遊戲中加入物理引擎可以使我們的遊戲更加真實,爲玩家展示一個更真實的世界,cocos2d-x支持兩個物理引擎Box2d和Chipmunk,本文介紹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