Фильтрация столкновений JBox2D (categoryBits, maskBits)

#android #box2d #jbox2d

#Android #box2d #jbox2d

Вопрос:

Я прочитал руководство по 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 amp; filter2.categoryBits) != 0 amp;amp; (filter1.categoryBits amp; filter2.maskBits) != 0;
return collide;
  

Итак, если maskBits = 0, то collide никогда не должен возвращать true. Я установил биты категорий в следующую свободную категорию — 0x8.

запуск

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

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

 0x2 amp; 0x2 = 2
0x2 amp; 0x0 = 0
  

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

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

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

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

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

1. Вы говорите «Итак, если maskBits = 0, то collide никогда не должен возвращать true .», но вы это проверяли?

2. Да, я протестировал все комбинации, которые я перечисляю внизу.

3. Я не знаю, будет ли иметь значение тот факт, что я запускаю это на телефоне Android. Это единственное, о чем я могу думать. Я также попытался установить для проигрывателя и groupIndex триггера значение -1, которое должно предотвращать столкновение.

4. Хорошо, вы тестировали разные входные данные, но использовали ли вы журнал или отладчик, чтобы проверить, каково фактическое значение «collide» во время выполнения?

5. Хорошо, этот вопрос может быть удален. Спасибо за помощь, Паоло. Я обнаружил, что мой код фактически не создавал экземпляр правильного физического объекта. Мои физические объекты отделены от обычных игровых объектов, и я создавал экземпляр игрового объекта с неправильным физическим объектом. Маски работают так, как ожидалось, и как я объяснил, но проблема заключалась в том, что другой физический объект взаимодействовал за кулисами с моим игровым объектом. Очень неприятно узнать!