Фильтр Box2d (маски и биты категорий)

Я искал несколько раз, но я не уверен, почему моя фильтрация контактов не работает. Я использовал libgdx для создания этой простой игры. Код выглядит следующим образом:

public static final short BORDER_CATEGORY_BITS = 0x0001;
public static final short PLAYER_CATEGORY_BITS = 0x0002;
public static final short ENEMY_CATEGORY_BITS = 0x0003;
public static final short FOOD_CATEGORY_BITS = 0x0004;

public static final short BORDER_MASK_BITS = PLAYER_CATEGORY_BITS;
public static final short PLAYER_MASK_BITS = BORDER_CATEGORY_BITS | ENEMY_CATEGORY_BITS;
public static final short ENEMY_MASK_BITS = PLAYER_CATEGORY_BITS;
public static final short FOOD_MASK_BITS = PLAYER_CATEGORY_BITS;

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

1 ответ

Решение

Ваш ENEMY_CATEGORY_BITS неправильно.
0x0003 на самом деле 0x0001 | 0x0002, Это означает, что вы говорите

ENEMY_CATEGORY_BITS = BORDER_CATERGORY_BITS | PLAYER_CATERGORY_BITS

Итак, ты говоришь Enemy это Player и Border и в качестве Player сталкивается с Border, Enemy столкнется с Border к.

Чтобы установить биты правильно, вам нужно использовать power of 2с, как 1, 2, 4, 8, 16, 32...

Также всегда убедитесь, что оба объекта сталкиваются друг с другом, если Player сталкивается с Border, но Border не сталкивается с Player, не будет столкновения Игрока-Борейдера.
Я предлагаю вам прочитать учебники iForce2D Box2D

Другие вопросы по тегам