libro
www.tuyano.com
初心者のためのCocos2d-xゲームプログラミング入門

物理エンジンを使おう (1/4)

作成:2015-06-20 11:28
更新:2015-06-20 11:42

■物理SceneとPhysicsWorld

ゲームでは、モノを現実の物体のように扱う必要が生じることもあります。というとわかりにくいですが、例えば物と物が衝突したり、上にあるものが重力で落下したりすることですね。こうした動きは、ただの「絵」が動いているんじゃなくて、実際に「モノ」として扱われているからこそできることです。

こうした「モノとして扱うための仕組み」を提供するプログラムを「物理エンジン」と一般に呼んだりします。Cocos2d-xにも、この物理エンジンに相当する処理は組み込まれています。実際にそれを使ってみることにしましょう。

物理シミュレーションを行うためには、いろいろと理解しておかないといけないことがあります。順に説明していくことにしますね。

●物理Sceneを用意する
先ず最初に行うのは、「物理演算に対応したSceneを用意すること」です。これまで、クラスのcreateSceneメソッドで、Scene::createを呼び出してSceneを作ってきました。物理シミュレーションを行うためには、物理演算対応のSceneを用意しないといけないのです。

下に、createSceneメソッドのサンプルを挙げておきます。これを見ながら、Scene作成の手順を整理していきましょう。

1. 物理Sceneインスタンスの作成
auto scene = Scene::createWithPhysics();
Sceneの作成は、createではなく、「createWithPhysics」というメソッドを使います。これで、物理シミュレーション可能なSceneが作成されます。

2. PhysicsWorldの取得
PhysicsWorld* world = scene->getPhysicsWorld();

物理Sceneには、「PhysicsWorld」というインスタンスが組み込まれています。これが、物理演算のために必要な情報などを管理しています。必要な設定を行うために、これを取り出しておきます。

3. 重力、速度などを設定する
world->setGravity(Vec2(0, -500));
world->setSpeed(1.0f);
PhysicsWorldには、物理エンジンで必要となる各種の情報が保管されています。その中でも重要となるのは、「重力」と「速度」でしょう。

重力は、「setGravity」で設定をします。これはVec2を引数に指定します。Vec2は、2つの値を一つにまとめたものでしたね。これにより、横方向と縦方向の重力(引っ張られる力)を設定します。一般的な「下に引っ張られる重力」ならばVec2の第1引数(横方向の値)をゼロに、第2引数(縦方向の値)をマイナスの値に設定しておきます。

速度は、要するに時間の縮尺ですね。速度を大きく設定すれば、映画を早回ししているように速く動きます。これは「setSpeed」で指定します。値は、速度の倍率(標準速度なら1.0)で指定します。

4. デバッグ用の表示設定
world->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
これは、実は物理エンジン利用とは直接関係ないんですが、覚えておくと便利なので紹介しておきましょう。「setDebugDrawMask」は、デバッグのための表示を設定するものです。

後述しますが、物理Sceneでは、それぞれのスプライトに「剛体(PhysicsBody)と呼ばれるものを組み込みます。このsetDebugDrawMaskは、組み込まれている剛体の形をそのまま画面に表示します。これにより、それぞれのスプライトに設定されている「モノ」としての形がよくわかるようになるのです。もちろん、プログラムが完成したらこれは削除しておきましょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

Scene* HelloWorld::createScene()
{
    auto scene = Scene::createWithPhysics();
    PhysicsWorld* world = scene->getPhysicsWorld();
    world->setGravity(Vec2(0, -500));
    world->setSpeed(1.0f);
    world->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
    auto layer = HelloWorld::create();
    scene->addChild(layer);
    return scene;
}
※関連コンテンツ

「初心者のためのCocos2d-xゲームプログラミング入門」に戻る