Box2d - обнаружение только одиночных столкновений - PullRequest
1 голос
/ 19 июля 2011

Я пишу игру, в которой ведется подсчет количества ударов по мячу - идея в том, чтобы поразить как можно больше.Я использую Cocos2d и Box2d для определения физики и обнаружения столкновений.

Подсчет очков работает, но иногда шары в конечном итоге движутся вдоль стороны друг друга, когда это происходит, когда регистрируется несколько столкновений.В идеале я хочу, чтобы для каждого реального столкновения было записано только одно столкновение (то есть счет ++).

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

В настоящее время я использую следующий код в своей функции тиков

//detect collisions
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) {
        NSLog(@"Collision!");

        score++;
        [scoreLabel setString:[NSString stringWithFormat:@"Score: %d", score]];
    }    
}

1 Ответ

3 голосов
/ 19 июля 2011

Вы только проверяете, было ли столкновение вообще. Вам нужно проверить, какие объекты столкнулись, и записать это.

Например:

Обычно я буду проходить через мои коллизии, как вы делаете, но я записываю спрайт и / или тело в массив. При проверке столкновений выполните проверку, чтобы убедиться, что в вашем массиве еще не сохранен этот спрайт / тело. Если это так, то вы уже совершили это столкновение, а если нет, сохраните это столкновение. Затем, после проверки всех моих столкновений, я удаляю все спрайты и тела и добавляю свои очки.

Контактный слушатель сообщит о контакте как тела, попавшего в тело B, так и тела, попавшего в тело A. Это два разных столкновения, что касается контактного слушателя.

...