Cocos2dx 3.0 物理演算を試してみる

raharu(仮名)(プログラマー)
これがダイバージェンス1%の先の世界か。。。

Cocos2dxはv3.0からChipmunk2Dに統一されたみたいですが、
物理演算系の資料が少ないので備忘録なにかご指摘などありましたらご連絡ください

GameScene.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Scene* GameScene::createScene()
{
    //物理演算を使う為にcreateWithPhysicsを使用
    auto scene = Scene::createWithPhysics();

    //Worldに対して重力をセット
    Vect gravity;
    gravity.setPoint(0, -50);
    scene->getPhysicsWorld()->setGravity(gravity);
    scene->getPhysicsWorld()->setSpeed(6.0f);

    //物理オブジェクトにを可視的にしてくれるデバックモード
    scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);

    auto layer = GameScene::create();
    scene->addChild(layer);

    return scene;
}

scene->getPhysicsWorld()–>setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);

物理オブジェクトの対象範囲を可視的に見せてくれます。
非常に便利ですので開発するときはセットしておきましょう

GameScene.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// on "init" you need to initialize your instance
bool GameScene::init()
{
    //初期化
    if ( !Layer::init() ) return false;

    //画面サイズサイズを取得
    auto window_size = Director::getInstance()->getWinSize();

    //床
    auto wall = Sprite::create();
    wall->setPosition(150, 0);
    wall->setTextureRect(Rect(0,0,1000,100));
    wall->setColor(Color3B(255,255,255));
    wall->setRotation(10.0f);
    //反発係数と摩擦係数
    auto material = PHYSICSBODY_MATERIAL_DEFAULT;
    material.restitution = 0.0f;
    material.friction = 0.0f;

    auto pWall = PhysicsBody::createBox(wall->getContentSize(), material);
    //重力干渉を受けるか
    pWall->setDynamic(false);
    //回転させるか
    pWall->setRotationEnable(false);
    wall->setPhysicsBody(pWall);
    addChild(wall);

    //丸いボール
    auto ball = Sprite::create();
    ball->setPosition(20, 300);
    ball->setColor(Color3B(255,255,255));
    auto pBall = PhysicsBody::createCircle(10.0f);
    pBall->setDynamic(true);
    pBall->setRotationEnable(true);
    ball->setPhysicsBody(pBall);
    addChild(ball);

    return true;
}

auto material = PHYSICSBODY_MATERIAL_DEFAULT;

material.restitution = 0.0f;  
material.friction = 0.0f;  

マテリアルの密度、反発係数、摩擦係数を指定出来ます。

auto pWall = PhysicsBody::createBox(wall->getContentSize(), material);

PhysicsBodyはこれ以外にも質量やスピードなどの指定も可能です。

f:id:raharu0425:20140521112943p:plain

オブジェクトが赤くマスクがかかっているのが、
scene->getPhysicsWorld()–>setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
これの恩恵です。

Spriteは衝突している様に見えるのに動きがへんな場合は衝突判定範囲がSpriteからずれている可能性がありますので、マスクをかけて検証するのが良いでしょう。