Кто-нибудь знает, будут ли только тела сталкиваться, когда (body1.categoryBits и body2.maskBits) && & && (body1.maskBits и body2.categoryBits)? или они уже сталкиваются, когда (body1.categoryBits и body2.maskBits) || (body1.maskBits и body2.categoryBits)?
Группы столкновения box2d
Ответ 1
Если кто-то все еще ищет больше объяснений, я сделал подробный учебник здесь:
http://aurelienribon.wordpress.com/2011/07/01/box2d-tutorial-collision-filtering/
Ответ 2
Из Box2D manual:
6.2.3. Фильтрация
Фильтрация столкновений - это система для предотвращая столкновение между фигурами. Например, скажем, вы делаете персонажа который едет на велосипеде. Вы хотите, чтобы велосипед столкнется с рельефом и характер столкновения с местности, но вы не хотите, чтобы персонаж столкнется с велосипедом (потому что они должны перекрываться). Box2D поддерживает такую фильтрацию столкновения используя категории и группы.
Box2D поддерживает 16 столкновений категории. Для каждой фигуры вы можете укажите, к какой категории принадлежит. Вы также указываете, какие другие категории эта форма может столкнуться. Для Например, вы можете указать в многопользовательская игра, в которой все игроки не сталкиваются друг с другом и монстры не сталкиваются с каждым другие, но игроки и монстры должны сталкиваются. Это делается с помощью маскировки биты. Например:
playerShapeDef.filter.categoryBits = 0x0002; monsterShapeDef.filter.categoryBits = 0x0004; playerShape.filter.maskBits = 0x0004; monsterShapeDef.filter.maskBits = 0x0002;
Группы конфликтов позволяют указать интегральный индекс группы. Вы можете иметь все формы с тем же групповым индексом всегда сталкиваются (положительный индекс) или никогда не сталкивайтесь (отрицательный индекс). группа индексы обычно используются для вещей которые так или иначе связаны, как части велосипеда. В следующих Например, shape1 и shape2 всегда сталкиваться, но shape3 и shape4 никогда сталкиваюсь.
shape1Def.filter.groupIndex = 2; shape2Def.filter.groupIndex = 2; shape3Def.filter.groupIndex = -8; shape4Def.filter.groupIndex = -8;
Коллизии между формами разных индексы групп фильтруются согласно бит категории и маски. В других слова, групповая фильтрация выше предпочтителен, чем фильтрация по категориям.
Ответ 3
Вот так я понял, как работают маски и биты. Скажем, у вас есть 3 объекта: objectA, objectB и objectC.
Определите для каждого объекта категорию:
objectA.categoryBits = 0x0002;
objectB.categoryBits = 0x0004;
objectC.categoryBits = 0x0008;
Затем установите maskBits, которые определяют правила коллизий для каждой категории:
- > objectA сталкивается со всеми (0xFFFF) и (&) не (~) objectB (0x0004)
objectA.maskBits = 0xFFFF и ~ 0x0004;
- > objectB сталкивается с objectA (0x0002) или (|) objectC (0x0008), но никого больше нет objectB.maskBits = 0x0002 | 0x0008;
- > objectC сталкивается с objectA (0x0002), но никто другой
objectC.maskBits = 0x0002;
Я не знаю, правильно ли это, но это сработало для меня.
НТН
Ответ 4
Глядя на источник Box2d, он показывает, что если светильники принадлежат к разным группам (или группы равны 0), то их можно сравнить следующим образом:
bool collide = (filterA.maskBits & filterB.categoryBits) != 0 &&
(filterA.categoryBits & filterB.maskBits) != 0;
Таким образом, похоже, что привязка только сталкивается, если столкновение разрешено обеими масками. (IE: И логика)
Ответ 5
Я использовал стены и множество игроков (нашего Игрока и врагов). Мой игрок и враги сталкиваются со стенами, но не сталкиваются друг с другом. Я сделал так, и это сработало. Вы должны установить для параметра groupIndex отрицательное значение, чтобы объекты не сталкивались друг с другом. Определите такие светильники.
/* The categories. */
public static final short CATEGORYBIT_WALL = 1;
public static final short CATEGORYBIT_PLAYERS = 2;
/* And what should collide with what. */
public static final short MASKBITS_WALL = CATEGORYBIT_WALL + CATEGORYBIT_PLAYERS;
public static final FixtureDef WALL_FIXTURE_DEF = PhysicsFactory.createFixtureDef(0, 0.5f, 0.5f, false, CATEGORYBIT_WALL, MASKBITS_WALL, (short)0);
public static final FixtureDef PLAYERS_FIXTURE_DEF = PhysicsFactory.createFixtureDef(1, 0.5f, 0.5f, false, CATEGORYBIT_PLAYERS, MASKBITS_WALL, (short)-1);
и применитесь к своим телам.
AnimatedSprite player, enemy;
Body playerBody, enemyBody;
player= new AnimatedSprite(CAMERA_WIDTH/2, CAMERA_HEIGHT/2, this.playerRegion, this.getVertexBufferObjectManager());
playerBody = PhysicsFactory.createBoxBody(this.mPhysicsWorld, player, BodyType.DynamicBody, PLAYERS_FIXTURE_DEF);
this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(player, playerBody, true, false));
enemy= new AnimatedSprite(CAMERA_WIDTH/4, CAMERA_HEIGHT/2, this.enemyRegion, this.getVertexBufferObjectManager());
enemyBody= PhysicsFactory.createCircleBody(this.mPhysicsWorld, enemy, BodyType.DynamicBody, PLAYERS_FIXTURE_DEF);
this.mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(enemy, enemyBody, true, false));