Светильники Libgdx Box2D, которые являются датчиками и не датчиками? - PullRequest
0 голосов
/ 22 мая 2019

Допустим, у меня есть тела A, B и C, каждое с одним приспособлением. Возможно, что приборы A и B взаимодействуют друг с другом, причем один или оба являются датчиками, поэтому физическое взаимодействие не происходит, но есть ли у A и B физические взаимодействия с устройством C? Итак, A-B = нет взаимодействия, A-C = взаимодействие, B-C = взаимодействие

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Да, это возможно при использовании битов маски и битов категории.Они позволяют приборам взаимодействовать только с некоторыми другими приборами, определенными с использованием этих битов.

Биты категории определяют тип приборов, по умолчанию это 0.

Биты маски определяют, с какими категориями приборов может взаимодействовать прибор.с.


Итак, чтобы A и B взаимодействовали с C, но не друг с другом, нам необходимо применить следующие биты категории:

A.filter.categoryBits = 0x0001; //binary: 01
B.filter.categoryBits = 0x0001; //binary: 01
C.filter.categoryBits = 0x0002; //binary: 10

И следующие биты маски:

A.filter.maskBits = 0x0002; //binary: 10
B.filter.maskBits = 0x0002; //binary: 10
C.filter.maskBits = 0x0001; //binary: 01

Поскольку A и B относятся к категории 0x0001, а C имеет маску 0x0001, C может взаимодействовать с A и B. A и B не содержат 0x0001 в своей маске, поэтому не могут взаимодействоватьдруг с другом.


Более подробное объяснение и пример можно найти здесь .

1 голос
/ 22 мая 2019

Вы должны посмотреть на фильтрацию столкновений (маскирование)

Установив категории и маски для различных объектов, вы можете контролировать, какие из них могут взаимодействовать друг с другом.

// create categories
final short A = 0x0001;  // 0000000000000001 in binary
final short B = 0x0002; // 0000000000000010 in binary
final short C = 0x0004; // 0000000000000100 in binary

// create masks
final short AM = 0x0006 // 0000000000000110 in binary
final short BM = 0x0006 // 0000000000000110 in binary
final short CM = 0x0001 // 0000000000000001 in binary

// apply masks and categories to fixtures
FixtureDef ADef = new FixtureDef();
ADef.filter.categoryBits = A;
ADef.filter.maskBits = AM;
...