物理エンジンを使おう (2/4)
作成:2015-06-20 11:31
更新:2015-06-20 11:31
更新:2015-06-20 11:31
■剛体(PhysicsBody)を作成する
これでSceneの用意はできました。次に行うのは、「Spriteへの、剛体の組み込み」です。
剛体というのは、物理特性を持った、目に見えない物質のようなもの、と考えて下さい。スプライトというのは、ただの「絵」ですから、重さもありませんし、ぶつかってもそのまま素通りします。そこで、このスプライトに「物質としての形や重さなどの性質」を組み込むために用意されるのが剛体です。
これは、「PhysicsBody」というクラスとして用意されています。これは以下のような手順でSpriteインスタンスに組み込みます。
1. インスタンスを作成する
まず、PhysicsBodyのインスタンスを作成します。これはPhysicsBosyクラスにあるメソッドを利用します。メソッドは、作成する剛体の形に応じて幾種類か用意されています。
ここでは、四角形と円形のメソッドを挙げておきましょう。「createBox」は、四角形の剛体を作ります。引数には、大きさの値として用いられるSize構造体というものを指定します。また、「createCircle」は、円形の剛体を作成します。引数には、円の半径をfloat値で指定します。
2. 物理的な動きをON/OFFする
「setDynamic」で、物理エンジンによる動きをON/OFFします。引数にfalseを設定するとOFFになり、trueを設定するとONになります。実際に物理特性に従って動くスプライト(キャラクタなど)はONにしますが、動かないスプライト(地面や壁、障害物など)はOFFにしておきます。
3. 回転をロック/アンロックする
4. Spriteに設定する
では、実際の利用例を下にあげておきましょう。ここでは、横長の地面のイメージ(base.png)と、キャラクタのイメージ(character.png)をそれぞれ用意し、「Resources」フォルダに入れておきます。
ここでは、地面のスプライトの上にキャラクタのスプライトを配置しています。実行すると、それぞれのスプライトに、四角形と円形の半透明な赤い図形が重ねて描かれるのがわかるでしょう。これが、setDebugDrawMaskによるデバッグ用の表示です。この文をカットすれば、普通にスプライトだけが表示されるようになります。
剛体というのは、物理特性を持った、目に見えない物質のようなもの、と考えて下さい。スプライトというのは、ただの「絵」ですから、重さもありませんし、ぶつかってもそのまま素通りします。そこで、このスプライトに「物質としての形や重さなどの性質」を組み込むために用意されるのが剛体です。
これは、「PhysicsBody」というクラスとして用意されています。これは以下のような手順でSpriteインスタンスに組み込みます。
1. インスタンスを作成する
auto 変数 = PhysicsBody::createBox( 大きさ );
auto 変数 = PhysicsBody::createCircle( 半径 );
まず、PhysicsBodyのインスタンスを作成します。これはPhysicsBosyクラスにあるメソッドを利用します。メソッドは、作成する剛体の形に応じて幾種類か用意されています。
ここでは、四角形と円形のメソッドを挙げておきましょう。「createBox」は、四角形の剛体を作ります。引数には、大きさの値として用いられるSize構造体というものを指定します。また、「createCircle」は、円形の剛体を作成します。引数には、円の半径をfloat値で指定します。
2. 物理的な動きをON/OFFする
《PhysicsBody》->setDynamic( 真偽値 );
「setDynamic」で、物理エンジンによる動きをON/OFFします。引数にfalseを設定するとOFFになり、trueを設定するとONになります。実際に物理特性に従って動くスプライト(キャラクタなど)はONにしますが、動かないスプライト(地面や壁、障害物など)はOFFにしておきます。
3. 回転をロック/アンロックする
《PhysicsBody》>setRotationEnable(false);
物理特性による動きを考えたとき、「回転」を許可するかどうかは重要です。例えば横スクロールゲームなどでは、キャラクタはどんなにぶつかったりしてもちゃんと上下の向きは保ったままになっていますね? setRotationEnableをtrueにすると、ぶつかったりして加えられた力によってキャラクタの向きも変わります。falseにすると、どんなに力が加わっても向きはロックされ変わらなくなります。4. Spriteに設定する
《Sprite》->setPhysicsBody(《PhysicsBody》);
PhysicsBodyの設定がひと通り完了したら、Spriteの「setPhysicsBody」を使い、作成したPhysicsBodyをSpriteに設定します。これで作業は終了です。では、実際の利用例を下にあげておきましょう。ここでは、横長の地面のイメージ(base.png)と、キャラクタのイメージ(character.png)をそれぞれ用意し、「Resources」フォルダに入れておきます。
ここでは、地面のスプライトの上にキャラクタのスプライトを配置しています。実行すると、それぞれのスプライトに、四角形と円形の半透明な赤い図形が重ねて描かれるのがわかるでしょう。これが、setDebugDrawMaskによるデバッグ用の表示です。この文をカットすれば、普通にスプライトだけが表示されるようになります。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
bool HelloWorld::init() { if (!Layer::init()) { return false; } Size visibleSize = Director::getInstance()->getVisibleSize(); Vec2 origin = Director::getInstance()->getVisibleOrigin(); Director::getInstance()->setDisplayStats(false); sprite1 = Sprite::create("base.png"); sprite1->setPosition(origin.x + visibleSize.width / 2, origin.y + 100); this->addChild(sprite1, 1); auto baseBody = PhysicsBody::createBox(sprite1->getContentSize()); baseBody->setDynamic(false); baseBody->setRotationEnable(false); sprite1->setPhysicsBody(baseBody); sprite1->setRotation(10.0f); sprite2 = Sprite::create("character.png"); sprite2->setPosition(origin.x + visibleSize.width / 2, origin.y + 300); this->addChild(sprite2, 1); auto charBody = PhysicsBody::createCircle(sprite2->boundingBox().size.width / 2); charBody->setMass(10.0f); charBody->setDynamic(true); charBody->setRotationEnable(true); sprite2->setPhysicsBody(charBody); return true; }
※関連コンテンツ
「初心者のためのCocos2d-xゲームプログラミング入門」に戻る