とあるプログラマの備忘録

都内某所に住むプログラマが自分用に備忘録を残すという趣旨のブログです。はてなダイアリーから移動しました!

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

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

GameScene.cpp

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

// 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からずれている可能性がありますので、マスクをかけて検証するのが良いでしょう。

--追記
Tiwtterにてcocos2d-extのインクルードが必要ないとのご指摘を頂きました。
ありがとうございますm( )m