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