Фильтр 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