Это не так, как работает столкновение. Когда два тела находится в пересечении, физический движок выполняет логический оператор AND
между телом collisionBitMask
и другим телом текущего в categoryBitMask
:
Когда две физических тела контактируют друг с другом, столкновение может произойти. Маска столкновения этого тела сравнивается с маской другого тела , выполняя логическую операцию И. Если результатом является ненулевое значение , на это тело влияет столкновение. Каждый орган независимо выбирает, хочет ли он быть затронутым другим телом. Например, для вы можете использовать это, чтобы избежать вычислений столкновений, которые бы приводили к незначительным изменениям скорости тела.
source.
Таким образом, результат зависит от того, как вы установили categoryBitMask
на этих двух телах. Значение по умолчанию для categoryBitMask
равно 0xFFFFFFFF
, означает, что все биты установлены. Поэтому, когда вы выполняете & между 0xFFFFFFFF
и 0b10
или 0b01
, результатом будет отличное от нуля значение, таким образом, столкновение.
Так, например, устанавливая свои тела, как это:
spriteA.physicsBody?.categoryBitMask = 0b01
spriteA.physicsBody?.collisionBitMask = 0b01
и
spriteB.physicsBody?.categoryBitMask = 0b10
spriteB.physicsBody?.collisionBitMask = 0b10
даст вам результат, который вы хотите. Кроме того, это, вероятно, не точная настройка, которая вам нужна, это просто простой пример, и вам придется изменять значения в соответствии с вашими потребностями. В этом случае spriteA столкнется только с телами, у которых categoryBitMask
установлено на 0b01
. То же самое касается spriteB, он столкнется с телами, у которых categoryBitMask
установлено на 0b10
.
Кроме того, в случае, если вы не хотите, чтобы эти спрайты, чтобы иметь возможность столкнуться с чем-либо, просто установите их collisionBitMask
свойства 0.
Вау благодарит вас за подробный ответ! Решила мою проблему! –