JBox2D фильтрация столкновений (биты категорий, биты маски) - PullRequest
1 голос
/ 13 мая 2011

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

У меня есть 3 категории вещей: игроки, препятствия и триггеры.

игроки и препятствия сталкиваются друг с другомно не с собой.У меня это работает, установив:

игрок

 circleDef.filter.categoryBits = 0x2;
 circleDef.filter.maskBits = 0x4;

препятствие

shapeDef.filter.categoryBits = 0x4;
shapeDef.filter.maskBits = 0x2;

Я хочутакже есть типы триггеров ... эти я использую только для обнаружения игрока и триггерных событий, но не должен сталкиваться с чем-либо.Логично, что это должно быть возможно, установив maskBits в 0x0.Код столкновения JBox2D выглядит следующим образом.

DefaultContactFilter.java

boolean collide = (filter1.maskBits & filter2.categoryBits) != 0 && (filter1.categoryBits & filter2.maskBits) != 0;
return collide;

Так что если maskBits = 0, то столкновение должно никогда возвращатьправда.Я установил биты категории в следующую свободную категорию - 0x8.

триггер

shapeDef.filter.categoryBits = 0x8;
shapeDef.filter.maskBits = 0x0;

Я думал, что это может быть связано с тем, что Java-целые работают иначе, чем я.ожидалось, но я проверил и нашел следующие результаты:

0x2 & 0x2 = 2
0x2 & 0x0 = 0

Триггеры предназначены для запуска событий.Это делается путем реализации CollisionListener и тестирования столкновений игроков с триггерами, а затем установки логических флагов.Однако, когда я запускаю симуляцию, игрок сталкивается с триггерами, как и препятствия.

Я также пытался установить биты категории и маски на следующие соответствующие значения:

0x0 0x0
0x8 0x8
0x2 0x4
0x4 0x2

И игрок всегда сталкивается с триггерным объектом.Как заставить игрока и препятствия, чтобы никогда не сталкивался с триггерным объектом?

...