下面咱們將使用Box2D物理引擎技術進行重構。使得關節可以掌握如何在Box2D使用關節約束。
HelloWorldScene.cpp中與使用關節的相關代碼以下:
html
[html] view plaincopy微信
void HelloWorld::addNewSpriteAtPosition(Vec2 p) ide
{ 函數
log("Add sprite %0.2f x %02.f",p.x,p.y); 網站
//建立物理引擎精靈對象A this
auto spriteA = Sprite::create("BoxA2.png"); ① spa
spriteA->setPosition(p); .net
this->addChild(spriteA); orm
// 動態物體A定義 視頻
b2BodyDef bodyDef;
bodyDef.type = b2_dynamicBody;
bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);
b2Body *bodyA = world->CreateBody(&bodyDef);
bodyA->SetUserData(spriteA); ②
//建立物理引擎精靈對象B
auto spriteB = Sprite::create("BoxB2.png"); ③
spriteB->setPosition(p + Vec2(100, -100)); ④
this->addChild(spriteB);
// 動態物體B定義
bodyDef.type = b2_dynamicBody;
Vec2 posB = spriteB->getPosition();
bodyDef.position.Set(posB.x/PTM_RATIO , posB.y /PTM_RATIO); ⑤
b2Body *bodyB = world->CreateBody(&bodyDef);
bodyB->SetUserData(spriteB); ⑥
// 定義2米見方的盒子形狀
b2PolygonShape dynamicBox;
dynamicBox.SetAsBox(1, 1);
// 動態物體夾具定義
b2FixtureDef fixtureDef;
//設置夾具的形狀
fixtureDef.shape = &dynamicBox;
//設置密度
fixtureDef.density = 1.0f;
//設置摩擦係數
fixtureDef.friction = 0.3f;
//使用夾具固定形狀到物體上
bodyA->CreateFixture(&fixtureDef); ⑦
bodyB->CreateFixture(&fixtureDef); ⑧
// 距離關節定義
b2DistanceJointDef jointDef; ⑨
jointDef.Initialize(bodyA, bodyB, bodyA->GetWorldCenter(),
bodyB->GetWorldCenter()); ⑩
jointDef.collideConnected = true; ⑪
bodyA->GetWorld()->CreateJoint(&jointDef); ⑫
}
上述代碼第①~②行是建立精靈對象A和建立物體A。第③~⑥行是建立精靈對象B和建立物體B。代碼第④行是設置精靈B的位置,p是觸摸點的位置,p + Vec2(100, -100)表示在觸摸點的右下方,相對位置(100, -100)。第⑤行代碼是設置物體B的位置,它的單位是米,所以須要精靈B的位置除以PTM_RATIO。
第⑦行和第⑧行代碼是使用夾具固定形狀(2米見方的盒子形狀)到物體A和物體B上。因爲形狀相相同,使用同一個夾具定義fixtureDef分別固定到物體上。
第⑨~⑫行代碼是添加距離關節,其中第⑨行代碼b2DistanceJointDef jointDef是聲明距離關節定義,第⑩行代碼jointDef.Initialize(bodyA, bodyB, bodyA->GetWorldCenter(),bodyB->GetWorldCenter())是初始化距離關節定義,其中第一個和第二參數是物體A和物體B的錨點,第三參數和第四參數是物體A和物體B的世界座標,bodyA->GetWorldCenter()函數是得到物體A中心點的世界座標。第⑪行代碼jointDef.collideConnected = true是容許相連的物體碰撞。第⑫行代碼bodyA->GetWorld()->CreateJoint(&jointDef)是經過物理世界對象根據jointDef(關節定義)建立關節。
在上面的實例中,咱們只是使用了距離關節,而Box2D v2版本中定義了不少關節。這些關節包括:
距離關節。兩個物體之間保持固定的距離。每一個物體上的點稱爲錨點。關節定義是b2DistanceJointDef。
旋轉關節。容許物體圍繞公共點旋轉。關節定義是b2RevoluteJointDef。
平移關節。兩個物體之間的相對旋轉是固定的,它們能夠沿着一個座標軸進行平移。關節定義是b2PrismaticJointDef。
焊接關節。能夠把物體固定在相同方向上。關節定義是b2WeldJointDef。
滑輪關節。滑輪關節用於建立理想的滑輪,兩個物體位於繩子兩端,繩子經過某個固定點(滑輪的位置)將兩個物體鏈接起來。這樣當一個物體升起時,另外一個物體就會降低。滑輪兩端的繩子總長度不變。關節定義是b2PulleyJointDef。
摩擦關節。下降兩個物體之間的相對運動。關節定義是b2FrictionJointDef。
齒輪關節。控制其它兩個關節(旋轉關節或者平移關節),其中一個的運動會影響另外一個。關節定義是b2GearJointDef。
鼠標關節。點擊物體上任意一個點能夠在世界範圍內進行拖動。關節定義是b2MouseJointDef。
這些關節定義初始化的時候參數都各不相同,可是參數都是比較相似的。此外,除了上面列出的關節外,還有一些其它的關節,這關節不是很經常使用,這裏再也不一一介紹了。
更多內容請關注國內第一本Cocos2d-x 3.2版本圖書《Cocos2d-x實戰:C++卷》
本書交流討論網站:http://www.cocoagame.net
更多精彩視頻課程請關注智捷課堂Cocos課程:http://v.51work6.com
歡迎加入Cocos2d-x技術討論羣:257760386
歡迎關注智捷iOS課堂微信公共平臺