Получить все подключения b2Body в игре для iOS - PullRequest
0 голосов
/ 04 декабря 2011

Я разрабатываю игру для iPhone с cocos2d, box2d для iPhone.У меня есть одна проблема здесь.enter image description here

Как видно на скриншоте выше, эти шары b2Body.Каждый идет правильно, кроме одного.Когда я нажимаю на шар, я хочу, чтобы он был удален с экрана, и он работает хорошо.

Однако мне нужно удалить все подключенные шарики одного цвета.Например, когда я касаюсь красного шарика внизу, все красные шарики, которые пересекаются с этим повернутым шариком, тоже должны быть удалены.

Этот метод управляет положением крана

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    for( UITouch *touch in touches ) {
    CGPoint location = [touch locationInView: [touch view]];

    location = [[CCDirector sharedDirector] convertToGL: location];
    b2Vec2 locationWorld = b2Vec2(location.x/PTM_RATIO, location.y/PTM_RATIO);

    // go through every single b2Body
    for(b2Body *b = world->GetBodyList(); b; b=b->GetNext()) {    
        if (b->GetUserData() != NULL) {

            b2Fixture *bf = b->GetFixtureList();

            // check which ball is tapped
            if (bf->TestPoint(locationWorld)) {
                [self destroyBall:b];
            }
        }        
    }
}

Метод destroyBall - это рекурсивный метод, который записан так:

- (void) destroyBall:(b2Body *)body_ {
CCSprite *bodySprite = (CCSprite *) body_->GetUserData();
CGFloat h2 = bodySprite.contentSize.height / 2;
CGFloat w2 = bodySprite.contentSize.width / 2;

b2Vec2 p1 = b2Vec2((bodySprite.position.x - w2) / PTM_RATIO, (bodySprite.position.y - h2) / PTM_RATIO);
b2Vec2 p2 = b2Vec2((bodySprite.position.x - w2) / PTM_RATIO, (bodySprite.position.y + h2) / PTM_RATIO);
b2Vec2 p3 = b2Vec2((bodySprite.position.x + w2) / PTM_RATIO, (bodySprite.position.y + h2) / PTM_RATIO);
b2Vec2 p4 = b2Vec2((bodySprite.position.x + w2) / PTM_RATIO, (bodySprite.position.y - h2) / PTM_RATIO);

// go through all b2Body to check which one is intersect with body_
for (b2Body *b = world->GetBodyList(); b; b = b->GetNext()) {
    if ((b->GetUserData() != NULL) && (b != body_)) {
        CCSprite *newBall = (CCSprite *)b->GetUserData();

        b2Fixture *bf = b->GetFixtureList();
        if (bf->TestPoint(p1) || bf->TestPoint(p2) || bf->TestPoint(p3) || bf->TestPoint(p4)) {
            if (bodySprite.tag == newBall.tag) {
                [self destroyBall:b];
            }
        }
    }
}

CCSpriteBatchNode *batch = (CCSpriteBatchNode *) [self getChildByTag:kTagBatchNode];
[batch removeChild:bodySprite cleanup:YES];

world->DestroyBody(body_);
}

Идея очень проста, когда мяч A постукивается, он ищет другие шары, вокруг которых он ударяет мяч A. Если мяч B является единственным, процесс будет продолжаться с мячом B, пока не будет удара мяч.

Однакорекурсивная функция работает без остановки :(

Я очень признателен, если у вас есть идея или какой-либо алгоритм для использования этой функции с box2d

Большое спасибо заваша поддержка.

Тханг

1 Ответ

0 голосов
/ 05 декабря 2011

Я нашел решение сам. В рекурсивном методе я допустил большую и ужасную ошибку: не ставил точку останова, поэтому метод работает вечно.

Мяч просто продолжает проверять, я не помечал "найден и удаляю шарики".

Я исправил это, создав NSMutableArray и добавив CCSprite в этот NSMutableArray, когда обнаружен контактный шар. А рекурсивный метод просто вызывает шары, которые не найдены в этом NSMutableArray

...