0

私はbox2dベースのゲームを使用しており、プレイヤーの体が敵の体と衝突したことを検出しますが、衝突したポイントで敵のdestroybodyメソッドを作成すると、敵は破壊できず、エラーが発生し、アプリがクラッシュします。コードを表示します

std::vector<b2Body *>toDestroy; 
    std::vector<MyContact>::iterator pos;
    for(pos = contactListener->_contacts.begin(); 
        pos != contactListener->_contacts.end(); ++pos) {
        MyContact contact = *pos;
        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();
            if (spriteA.tag == 1 && spriteB.tag == 2) 
            {
                // SpriteA = PlayerSprite
                // SpriteB = EnemySprite
                NSString *t=[NSString stringWithFormat:@"Game Over"];
                label.string=t;
                [self removeChild:spriteB cleanup:YES];
                 world->DestroyBody(bodyB);
            } 
            else if (spriteA.tag == 2 && spriteB.tag == 1) 
            {
                //toDestroy.push_back(bodyB);
                NSLog(@"Enemy Touch");
            }
        }
    }

ここで私のspriteBは破壊できません。もう1つは、敵のスプライトがEnemy.mmファイルにあることです。

私がこの問題で立ち往生しているのを手伝ってください。前もって感謝します

4

1 に答える 1

0

敵とのプレイヤーの接触とは異なるプレイヤーとの敵の接触を処理するという根本的なエラーを犯している場合(単に順序だけです)、それらがどの順序で到着するかを知ることができないため、両方のケースを同じように扱う必要があります。また、toDestroy を適切に使用していません。

std::vector<b2Body *>toDestroy; 
    std::vector<MyContact>::iterator pos;
    for(pos = contactListener->_contacts.begin(); 
        pos != contactListener->_contacts.end(); ++pos) {
        MyContact contact = *pos;
        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();
            if ((spriteA.tag == 1 && spriteB.tag == 2) ||(spriteA.tag == 2 && spriteB.tag == 1)) 
            {
                // SpriteA = PlayerSprite
                // SpriteB = EnemySprite
                NSString *t=[NSString stringWithFormat:@"Game Over"];
                label.string=t;
                [self removeChild:spriteB cleanup:YES];
                 toDestroy.push_back(bodyB);
            } 

        }
        }
//iterate and delete everything from toDestroy
于 2012-08-09T17:46:40.327 に答える