Я прочитал руководство по 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
И игрок всегда сталкивается с триггерным объектом.Как заставить игрока и препятствия, чтобы никогда не сталкивался с триггерным объектом?