在cocos2dx v3版以后骄蝇,官方對Box2d和chipmunk兩個物理引擎進(jìn)行了封裝,對于我們開發(fā)人員而言,使用物理引擎的難度大大降低炊琉。
這里以構(gòu)建一個小車為例,對封裝的方法進(jìn)行介紹。
car.png
如圖所示苔咪,小車的組成很簡單锰悼,一個長方形加兩個圓形,貼圖都使用了同一個圖片团赏,只做演示使用箕般。
關(guān)鍵代碼:
//添加小車方法,參數(shù)為觸摸點(diǎn)坐標(biāo)
void Sence1::addNewCarAtPosition(Vec2 p) {
//獲取屏幕大小
Size visibleSize = Director::getInstance()->getVisibleSize();
//獲取起點(diǎn)(在cocos2dx中舔清,以屏幕的左下角為坐標(biāo)原點(diǎn))
Vec2 origin = Director::getInstance()->getVisibleOrigin();
//創(chuàng)建一個精靈對象丝里,作為長方形的車身
auto boxC = Sprite::create("whiteSprite.png");
//設(shè)置觸摸點(diǎn)為精靈所在的坐標(biāo)
boxC->setPosition(origin + p);
//創(chuàng)建物理Body
//以精靈的寬的兩倍,精靈的高度為大小創(chuàng)建一個Box Body
auto boxCBody = PhysicsBody::createBox(Size(boxC->getContentSize().width*2,boxC->getContentSize().height));
//為精靈設(shè)置物理Body
boxC->setPhysicsBody(boxCBody);
//設(shè)置物理Body的類別掩碼
boxCBody->setCategoryBitmask(0x01);
//設(shè)置物理body的碰撞掩碼
boxCBody->setCollisionBitmask(0x01);
//設(shè)置物理Body不受重力影響
boxCBody->setGravityEnable(false);
//添加精靈到物理世界
addChild(boxC, 30, 102);
auto boxA = Sprite::create("whiteSprite.png");
//將精靈的位置設(shè)置在觸摸點(diǎn)向左偏移boxC寬度的一半体谒,向下偏移boxC高度的一半
boxA->setPosition(origin + p +Vec2(-boxC->getContentSize().width/2,-boxC->getContentSize().height/2));
auto boxABody = PhysicsBody::createCircle(boxA->getContentSize().width/2);
// boxABody->setAngularVelocity(2.0f);
boxABody->setCategoryBitmask(0x10);
boxABody->setCollisionBitmask(0x10);
boxA->setPhysicsBody(boxABody);
addChild(boxA, 10, 100);
auto boxB = Sprite::create("whiteSprite.png");
boxB->setPosition(origin + p + Vec2(boxC->getContentSize().width/2, -boxC->getContentSize().height/2));
auto boxBBody = PhysicsBody::createCircle(boxB->getContentSize().width/2);
boxBBody->setAngularVelocity(2.0f);
boxBBody->setCategoryBitmask(0x10);
boxBBody->setCollisionBitmask(0x10);
boxB->setPhysicsBody(boxBBody);
addChild(boxB, 20, 101);
auto world = this->getScene()->getPhysicsWorld();
//使用圖釘關(guān)節(jié)將boxABody與boxCBody連接起來杯聚,坐標(biāo)我認(rèn)為是相對錨點(diǎn)的偏移
PhysicsJointPin* jointCA = PhysicsJointPin::construct(boxABody,
boxCBody, Vec2(0, 0),Vec2(-boxC->getContentSize().width/2-10,-boxC->getContentSize().height/2));
PhysicsJointPin* jointCB = PhysicsJointPin::construct(boxBBody,
boxCBody, Vec2(0, 0),Vec2(boxC->getContentSize().width/2+10,-boxC->getContentSize().height/2));
// PhysicsJointDistance* jointAB = PhysicsJointDistance::construct(boxABody,
// boxBBody, Vec2(0, 0), Vec2(0,0));
world->addJoint(jointCA);
world->addJoint(jointCB);
// world->addJoint(jointAB);
}