執行個體介紹Cocos2d-x中Box2D物理引擎:使用關節,cocos2d-xbox2d

來源:互聯網
上載者:User

執行個體介紹Cocos2d-x中Box2D物理引擎:使用關節,cocos2d-xbox2d
下面我們將使用Box2D物理引擎技術進行重構。使得關節能夠掌握如何在Box2D使用關節約束。
HelloWorldScene.cpp中與使用關節的相關代碼如下:

void HelloWorld::addNewSpriteAtPosition(Vec2 p){    log("Add sprite %0.2f x %02.f",p.x,p.y);//建立物理引擎精靈對象Aauto spriteA = Sprite::create("BoxA2.png");①spriteA->setPosition(p);this->addChild(spriteA);// 動態物體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);②//建立物理引擎精靈對象Bauto 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課堂公用平台



怎用Xcode工具,在cocos2d-x架構中添加Box2D物理引擎?

樓主遇到“can‘t find file”錯誤嗎?這個錯誤我糾結了很久,Search Path裡面該設定的都設定了,所有.m檔案都改成.mm,就是一直報錯,搜過N個貼都是說這樣設定就可以用,可我就沒有成功build過啊,求樓主搭救,萬分感謝
 
cocos2d 與box2d 2者有什不同

cocos2d和box2d是完全不同的東西,cocos2d是一個開源架構,可以構建2D環境,上面有CCScene,CCLayer,CCSprite等概念,用它可以構建很好的2d環境。
box2d是一個物理引擎,類比一個真實的實體環境,上面有重力加速度,摩擦力,剛體能概念,在這個環境裡,只要定義好相應的剛體和重力,摩擦力等外部環境,他們就可以自己處理碰撞。
因為box2d只是一個物理引擎,所以可以用在很多地方,例如flash,ios開發,window開發等方面。而cocos2d是Objective-c寫的,現在只能用在蘋果開發中。如果其他環境中想用cocos2d的話需要用cocos2d-x。
由於box2d只是一個物理引擎,無法構建情境,所以在ios開發中,如果要建立box2d工程,肯定也需要構建情境,因此工程也附帶給你添加了cocos2d庫。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.