チュートリアル最後になりそう。 ブロックを消して、ゲームオーバーとゲームクリアの実装へいく。 まずはブロックを消す感じを写経 ^^;
{ //ボールと衝突したブロックを検索 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
とりあえず今回はココで締め ^^;