Обнаружение столкновений Box2D?

#ios #cocos2d-iphone #box2d

#iOS #cocos2d-iphone #box2d

Вопрос:

Я добавляю b2BodyDef в свой CCScene следующим образом:

     b2BodyDef platformBodyDef;
    platformBodyDef.type = b2_dynamicBody;
    platformBodyDef.position.Set(40, 495);
    platformBodyDef.userData = platforms;
    _body = _world->CreateBody(amp;platformBodyDef);
  

Я знаю, что я должен использовать прослушиватели контактов, но я новичок в Box2D, и для меня это как другой язык, так как бы я закодировал его, чтобы увидеть, сталкивается ли один из CCSprites в моем CCScene с этим b2BodyDef? Этот b2BodyDef будет анимироваться, но я не беспокоюсь об этом прямо сейчас.
Кто-нибудь знает, как я могу это сделать?

Спасибо!

Ответ №1:

Здесь есть очень хороший учебник, описывающий, как это сделать

В основном, что вы делаете, это создаете ContactListener, который прослушивает столкновения между телами. Убедитесь, что ваши спрайты помечены, а затем в прослушивателе контактов вы загружаете spriteData двух столкнувшихся объектов. Проверяя теги, вы можете идентифицировать столкнувшиеся спрайты.

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

Комментарии:

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

2. Извините за поздний ответ — надеюсь, это поможет кому-то еще… В методе предварительного вычисления ContactListener вы можете отменять события. Таким образом, вы можете пометить тело тегом, который нужно удалить в этом методе, а затем отменить событие. Затем, когда вы перебираете все тела и обновляете их позиции и т. Д. … Если спрайт помечен как подлежащий удалению, вы удаляете его.

3. Вот что я делаю, я просто меняю тег, как только он сталкивается, а затем оператор collision if больше не вызывается для этого столкновения!