cocos2d-x で Box2D を使う 〜 回転ジョイントで物体を空中にピン留めする
はじめに
cocos2d-x と Box2D のテスト引き続き。
回転ジョイントを使って、物体を背景にくっつけて、空中にピン留めします。
やること
これまで通りに物体を作成し、背景要素とジョイントします。
参考サイト
http://www.iforce2d.net/b2dtut/joints-revolute
http://sometimes-note.blogspot.jp/2011/05/box2d_07.html
コード
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); }