#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 больше не вызывается для этого столкновения!