nirasan's tech blog

趣味や仕事の覚え書きです。Linux, Perl, PHP, Ruby, Javascript, Android, Cocos2d-x, Unity などに興味があります。

cocos2d-x で Box2D を使う 〜 回転ジョイントで物体を空中にピン留めする

はじめに

cocos2d-x と Box2D のテスト引き続き。
回転ジョイントを使って、物体を背景にくっつけて、空中にピン留めします。

やること

これまで通りに物体を作成し、背景要素とジョイントします。

コード

GameScene.cpp
void GameScene::createStructure()
{
    CCSize size = CCDirector::sharedDirector()->getWinSize();
    
    /* Spriteの作成 */
    PhysicsSprite* pSprite = new PhysicsSprite();
    pSprite->autorelease();
    pSprite->initWithTexture(spriteBatchNode->getTexture());
    pSprite->setPosition(ccp(size.width * 0.5, size.height * 0.5));
    pSprite->setTag(Config::kTag_Ground);
    this->addChild(pSprite);
    
    /* 物体の作成 */
    b2BodyDef spriteBodyDef;
    spriteBodyDef.type = b2_dynamicBody;
    spriteBodyDef.position.Set(pSprite->getPositionX() / PTM_RATIO,
                               pSprite->getPositionY() / PTM_RATIO);
    spriteBodyDef.userData = pSprite;
    b2Body* spriteBody = world->CreateBody(&spriteBodyDef);
    
    b2CircleShape spriteShape;
    spriteShape.m_radius = pSprite->getContentSize().width * 0.3 / PTM_RATIO;
    
    b2FixtureDef spriteFixturedef;
    spriteFixturedef.shape = &spriteShape;
    spriteFixturedef.density = 1;
    spriteFixturedef.friction = 10.0;
    spriteBody->CreateFixture(&spriteFixturedef);
    
    pSprite->setPhysicsBody(spriteBody);
    
    /* 背景を物理エンジン上の物体として取得 */
    b2Body* backgroundBody = world->CreateBody(new b2BodyDef());
    
    /* 回転ジョイントで背景に物体をピン留めする */
    // 回転ジョイントの定義の作成
    b2RevoluteJointDef revoluteJointDef;
    // つなぐものその1
    revoluteJointDef.bodyA = backgroundBody;
    // つなぐものその2
    revoluteJointDef.bodyB = spriteBody;
    // つないだもの同士は衝突しない
    revoluteJointDef.collideConnected = false;
    // つなぐものその1の座標上で、どの位置でつなぐか。
    // その1は背景なので、物体の座標を指定すると、物体が作成された位置でとどまる。
    revoluteJointDef.localAnchorA.Set(pSprite->getPositionX() / PTM_RATIO, pSprite->getPositionY() / PTM_RATIO);
    // ジョイントの作成
    world->CreateJoint(&revoluteJointDef);
}