Box2d をやってみる… チュートリアル2 (11) Destroying the Blocks

チュートリアル最後になりそう。 ブロックを消して、ゲームオーバーとゲームクリアの実装へいく。 まずはブロックを消す感じを写経 ^^;

    {
        //ボールと衝突したブロックを検索
        std::vector<b2Body *> toDestory;
        {
            std::vector<MyContact>::iterator pos;
            for (pos  = _contactListener->_contacts.begin();
                 pos != _contactListener->_contacts.end();
                 pos++)
            {
                MyContact contact = *pos;

                if (((contact.fixtureA == _bottomFixture) &&
                     (contact.fixtureB == _ballFixture)) ||
                    ((contact.fixtureA == _ballFixture) &&
                     (contact.fixtureB == _bottomFixture)))
                {
                    CCScene * scene = GameOverLayer::scene(false);
                    CCDirector::sharedDirector()->replaceScene(CCTransitionFade::create(1.0f, scene));

                    break;
                }
                else
                {
                    b2Body * bodyA = contact.fixtureA->GetBody();
                    b2Body * bodyB = contact.fixtureB->GetBody();

                    if ((bodyA->GetUserData() != NULL) &&
                        (bodyB->GetUserData() != NULL))
                    {
                        CCSprite * spriteA = (CCSprite *)bodyA->GetUserData();
                        CCSprite * spriteB = (CCSprite *)bodyB->GetUserData();

                        //ブロックを削除(tag == 2)
                        if ((spriteA->getTag() == 1) && (spriteB->getTag() == 2))
                        {
                            //削除対象に含まれていなければ
                            if (std::find(toDestory.begin(), toDestory.end(), bodyB) == toDestory.end())
                            {
                                toDestory.push_back(bodyB);
                            }
                        }
                        else if ((spriteA->getTag() == 2) && (spriteB->getTag() == 1))
                        {
                            if (std::find(toDestory.begin(), toDestory.end(), bodyA) == toDestory.end())
                            {
                                toDestory.push_back(bodyA);
                            }
                        }
                    }
                }
            }
        }

        //削除
        {
            std::vector<b2Body *>::iterator pos;
            for (pos  = toDestory.begin();
                 pos != toDestory.end();
                 pos++)
            {
                b2Body * body = *pos;
                if (body->GetUserData())
                {
                    CCSprite * sprite = (CCSprite *)body->GetUserData();
                    sprite->removeFromParentAndCleanup(true);
                }

                _world->DestroyBody(body);
            }
        }
    }

Objective-C を勉強し始めた頃から この オブジェクトにタグを付けておく記述 が新鮮だったなーwww ^^ Cocos2d-Xでも、自分はタグを付けておく方かなー。

実際に動かしてみたら、ゲームオーバーして再びゲームが始まったときにタップすると落ちてて…「うわーん何を失敗したー…? ^^;」とソースをにらめっこして数時間…。

単に mouseJoint 変数の初期化をしていなかっただけでした… orz

とりあえず今回はココで締め ^^;


Add a Comment

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