nirasan's tech blog

趣味や仕事の覚え書きです。Linux, Perl, PHP, Ruby, Javascript, Android, Cocos2d-x, Unity などに興味があります。

cocos2d-x で Box2D を使う 〜 物体の移動と力を与える

はじめに

前回の続きで、物体の移動と、物体への力を与える処理を試してみます。

タッチの有効化

  • GameScene::init に追記してタッチの有効化をする
GameScene.cpp
    // タッチ有効化
    setTouchEnabled(true);
    setTouchMode(kCCTouchesOneByOne);

タッチ時に物体を移動させる

  • 物体をタッチしたら力を加え、物体以外の場所をタッチしたらその場所に物体を移動させる。
GameScene.h
    // 物体をインスタンス変数に保持
    PhysicsSprite* pSprite;
    // タッチ開始時の処理
    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent * pEvent);
    // タッチ終了時の処理
    virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
GameScene.cpp
    pSprite = new PhysicsSprite();
  • タッチ実行時に物体の移動か力を与える
// タッチ開始時の処理。trueを返さないとタッチ終了処理が実行されない。
bool GameScene::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
    return true;
}
// タッチ終了時の処理
void GameScene::ccTouchEnded(CCTouch* pTouch, CCEvent* pEvent)
{
    // タッチしたポイント取得
    CCDirector* pDirector = CCDirector::sharedDirector();
    CCPoint touchPoint = pDirector->convertToGL(pTouch->getLocationInView());
    
    // 物体上の座標をタッチしていたら、上向きの力を与える。
    CCRect rect = pSprite->boundingBox();
    if (rect.containsPoint(touchPoint)) {
        b2Body* b = pSprite->getPhysicsBody();
        // 物体に力を与える
        b->ApplyForce(
            b2Vec2(0,50), // (0,0)から(0,50)へ上向きに垂直の力を作成
            b->GetWorldCenter() // 起点を物体の中央にとる
        );
    }
    // 物体以外の座標をタッチしたら、その場所に物体を移動させる。
    else {
        b2Body* b = pSprite->getPhysicsBody();
        // 物体の場所を変更(ワープ)させる
        b->SetTransform(
            b2Vec2(touchPoint.x / PTM_RATIO, touchPoint.y / PTM_RATIO), // 移動先の座標
            0 // 移動時の回転値
        );
        // 移動後に下向きの力を与えないとなんか空中で止まる
        b->SetLinearVelocity(b2Vec2(0, -10));
    }
}