實例介紹Cocos2d-x中Box2D物理引擎:使用關節

下面咱們將使用Box2D物理引擎技術進行重構。使得關節可以掌握如何在Box2D使用關節約束。
HelloWorldScene.cpp中與使用關節的相關代碼以下:
html

[html] view plaincopy微信

  1. void HelloWorld::addNewSpriteAtPosition(Vec2 p)  ide

  2. {      函數

  3.     log("Add sprite %0.2f x %02.f",p.x,p.y);  網站

  4.   

  5.   

  6.     //建立物理引擎精靈對象A  this

  7.     auto spriteA = Sprite::create("BoxA2.png");                                 ①  spa

  8.     spriteA->setPosition(p);  .net

  9.     this->addChild(spriteA);  orm

  10.   

  11.   

  12.     // 動態物體A定義  視頻

  13.     b2BodyDef bodyDef;  

  14.     bodyDef.type = b2_dynamicBody;  

  15.     bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);  

  16.     b2Body *bodyA = world->CreateBody(&bodyDef);  

  17.     bodyA->SetUserData(spriteA);                                         ②  

  18.   

  19.   

  20.     //建立物理引擎精靈對象B  

  21.     auto spriteB = Sprite::create("BoxB2.png");                                 ③  

  22.     spriteB->setPosition(p + Vec2(100, -100));                                   ④  

  23.     this->addChild(spriteB);  

  24.   

  25.   

  26.     // 動態物體B定義  

  27.     bodyDef.type = b2_dynamicBody;  

  28.     Vec2 posB = spriteB->getPosition();  

  29.     bodyDef.position.Set(posB.x/PTM_RATIO , posB.y /PTM_RATIO);                 ⑤  

  30.     b2Body *bodyB = world->CreateBody(&bodyDef);  

  31.     bodyB->SetUserData(spriteB);                                         ⑥  

  32.   

  33.   

  34.     // 定義2米見方的盒子形狀  

  35.     b2PolygonShape dynamicBox;  

  36.     dynamicBox.SetAsBox(1, 1);  

  37.   

  38.   

  39.     // 動態物體夾具定義  

  40.     b2FixtureDef fixtureDef;  

  41.     //設置夾具的形狀  

  42.     fixtureDef.shape = &dynamicBox;  

  43.     //設置密度  

  44.     fixtureDef.density = 1.0f;  

  45.     //設置摩擦係數  

  46.     fixtureDef.friction = 0.3f;  

  47.     //使用夾具固定形狀到物體上  

  48.     bodyA->CreateFixture(&fixtureDef);                                       ⑦  

  49.     bodyB->CreateFixture(&fixtureDef);                                       ⑧  

  50.   

  51.   

  52.     // 距離關節定義  

  53.     b2DistanceJointDef jointDef;                                            ⑨  

  54.     jointDef.Initialize(bodyA, bodyB, bodyA->GetWorldCenter(),  

  55.         bodyB->GetWorldCenter());                                            ⑩  

  56.     jointDef.collideConnected = true;                                       ⑪  

  57.     bodyA->GetWorld()->CreateJoint(&jointDef);                                    ⑫  

  58.   

  59.   

  60. }  



上述代碼第①~②行是建立精靈對象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課堂微信公共平臺

相關文章
相關標籤/搜索