2014-09-05 3 views
0

Основано на документах и ​​учебниках box2d, найденных в Интернете (лучше всего здесь http://www.iforce2d.net/b2dtut/collision-anatomy) Я предполагаю, что обработчик события столкновения beginContact должен происходить только один раз за столкновение.Box2d collision beginContant встречается более одного раза

Но я переживаю, что в некоторых случаях (я не мог сузить это до какого-то конкретного до сих пор) beginContact вызывается более одного раза.

Особый пример:

1st fixture is a box, belongs to static body and is a sensor 

2nd fixture (which is also player body in 2d game I'm building) 
is a polygon, belongs to dynamic body and is not a sensor. 

Both are large enough so in debug mode it is absolutely clear 
when these fixtures start to overlap and when they part. 

Result is - while player body fixture passes through static sensor, 
beginContact is called 3-4 times or more while fixtures keep oveplapping. 
Velocity is moderate (fixtures keep overlapping for a whole second and more). 

ли я пропустить что-то в документации? Может быть, это возможно?

ответ

1

Хорошо, я думаю, что нашел ответ или, по крайней мере, обходное решение. Может быть, это кому-то поможет.

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

Я думаю, что это часть инструкции, которая описывает случай:

Contacts are objects created by Box2D to manage collision between two fixtures. If the fixture has children, such as a chain shape, then a contact exists for each relevant child. 
0

Там другие светильники в мире, за исключением только тех двух? Вы проверяете, действительно ли событие BeginContact действительно для этих двух светильников? Есть ли что-нибудь об этом «3-4-кратном» поведении, которое заставит вас подозревать, что BeginContact может быть для других приборов, а не для статического датчика?

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

+0

Да, эти два являются единственными светильниками вокруг - это игрок и бонус, висящий в воздухе. Я узнал, что проблема связана с fixtureShape - я использовал ChainShape, чтобы получить преимущество от вершин-призраков (кстати, спасибо за отличный учебник по этим), и это, кажется, создает beginContact для каждой цепочки. Я добавил простой элемент PolygonShape к корпусу плеера, и он работает топор - один beginContact call на столкновение. – Lez77

Смежные вопросы