nirasan's tech blog

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

cocos2d-x で Box2D を使う 〜 スワイプで物体を動かす

はじめに

cocos2d-x と Box2D のテスト引き続き。
物体をスワイプすると、その方向に移動するようにします。

やること

タッチ開始から終了の間の移動量を計算し、物体に力として与えます。

削除フラグが立ってたら物体を削除

GameScene.cpp
private:
    CCPoint touchStartPoint;
    PhysicsSprite* targetSprite;
GameScene.cpp
bool GameScene::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
    // タッチ開始時の座標を保存
    CCDirector* pDirector = CCDirector::sharedDirector();
    touchStartPoint = pDirector->convertToGL(pTouch->getLocationInView());
    
    // タッチした物体を検索して保存
    targetSprite = NULL;
    list<PhysicsSprite*>::iterator it = pSpriteList.begin();
    while(it != pSpriteList.end()) {
        PhysicsSprite* pSprite = *it;
        CCRect rect = pSprite->boundingBox();
        if (rect.containsPoint(touchStartPoint)) {
            targetSprite = pSprite;
            break;
        }
        it++;
    }
    
    return true;
}

void GameScene::ccTouchEnded(CCTouch* pTouch, CCEvent* pEvent)
{
    // タッチ終了時の座標を取得
    CCDirector* pDirector = CCDirector::sharedDirector();
    CCPoint touchEndPoint = pDirector->convertToGL(pTouch->getLocationInView());
    
    // 物体をタッチしていなければ新規作成
    if (targetSprite == NULL) {
        createSprite();
    }
    // 物体をタッチしていれば、タッチ開始から終了の座標を計算して、物体に力を与える
    else {
        b2Body* body = targetSprite->getPhysicsBody();
        float x = touchEndPoint.x - touchStartPoint.x;
        float y = touchEndPoint.y - touchStartPoint.y;
        CCLOG("[ccTouchENded] s(%f, %f) e(%f, %f) d(%f, %f)", touchStartPoint.x, touchStartPoint.y, touchEndPoint.x, touchEndPoint.y, x, y);
        body->ApplyForce(b2Vec2(x, y), body->GetWorldCenter());
    }
}