Box2d をやってみる… チュートリアル1 (6) Integrating Touch

長くても一週間ぐらいで流すつもりだったこのチュートリアル…気づいたら、はや一ヶ月間以上費やしている… orz

タップして kickを実行… よしやろう… ^^;

まずは init()で タップの操作を可能に…

    //タップ操作(シングルタップ)
    {
        ccTouchesMode mode = kCCTouchesOneByOne;
        this->setTouchMode(mode);

        this->setTouchEnabled(true);
    }

いつものように CCLayer.h から 定義をコピって来て、HelloWorld.h に張り付けて…

protected:
    virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);

HelloWorld.cpp で実装…と。ついでに座標からボールの位置をしらべて、ボールをタップしていたら…にしてみよう。というわけで、ccTouchBegan はこんな感じに。

bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
    CCPoint position = pTouch->getLocation();
    CCLOG("%s x:%f, y:%f", __PRETTY_FUNCTION__, position.x, position.y);

    this->kick(position);

    return true;
}

前回の kick() を改造だなー ^^
まずは引数で CCPoint を取れるように定義を修正し、bodydef の userData に関連づけておいた CCSprite を参照して CCRect の当たり判定を試してみた。

void HelloWorld::kick(CCPoint position)
{
    for (b2Body * b = _world->GetBodyList(); b; b = b->GetNext())
    {
        bool check = false;

        {
            CCSprite * ball = (CCSprite *)b->GetUserData();
            if (ball)
            {
                //当たり判定
                check = ball->boundingBox().containsPoint(position);
            }
        }

        //ボールをタップしていれば
        if (check)
        {
            float angle = CC_DEGREES_TO_RADIANS(b->GetAngle());
            const float distance = 200.0f;

            b2Vec2 force = b2Vec2(distance * cos(angle) - distance * sin(angle),
                                  distance * sin(angle) + distance * cos(angle));

            b->ApplyLinearImpulse(force, b->GetPosition());
        }
    }
}

とりあえずこんなっ感じで…チュートリアルは卒業…? ^^;
まぁ次いこうww ^^;

次はコレかなー
How To Create A Breakout Game with Box2D and Cocos2D 2.X Tutorial: Part 1

 


Add a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です