У вас включены столкновения между этими двумя телами.
Столкновения обрабатываются физическим движком, и столкновение происходит, когда 2 тела отскакивают друг от друга. Тела, которые настроены на столкновение, не могут занимать одно и то же пространство. Поместите 2 узла друг на друга, когда они настроены на столкновение, и они будут раздвигаться, пока не перестанут сталкиваться.
Контакты - это когда вы хотите, чтобы ваш код был уведомлен, когда 2 тела вступают в контакт. Тела можно настроить так, чтобы они контактировали, но не сталкивались, сталкивались, но не контактировали, сталкивались и регистрировали контакт или ни то, ни другое. Вдобавок одно тело может столкнуться со вторым телом без столкновения второго тела с первым (столкновение не повлияет на движение второго тела, в то время как первое тело может go улететь).
Если вы это сделаете ничего при создании среды Sprite Kit, столкновения включены между всеми телами (все отскакивает от всего) и контакты не включены ни для одного тела (ваш код никогда не будет вызываться, когда тела соприкасаются), поэтому во время настройки обычно приходится переключать выключить определенные столкновения и включить включить определенные контакты.
Столкновения между телами можно отключить (оставив существующие столкновения без изменений), используя:
nodeA.physicsBody?.collisionBitMask &= ~nodeB.category
Мы логически ИЛИ битовую маску коллизии nodeA с инверсией (логическое НЕ, оператор ~) битовой маски категории nodeB, чтобы «выключить» этот бит битовой маски nodeA. например, чтобы красный круг не сталкивался с 'слотом':
redCircle.physicsBody?.collisionBitMask = redCircle.physicsBody?.collisionBitMask & ~slotCategory
, который можно сократить до:
redCircle.physicsBody?.collisionBitMask &= ~slotCategory
это предполагает, что redCircle и slotCategory - это имена, которые вы используете для узла и битовых масок категории.
Это предотвратит отскакивание красного круга от слота, но не остановит отскакивание слот от красного круга, поэтому вам также могут понадобиться:
slotX.physicsBody?.collisionBitMask &= ~circleCategory
для каждого слота и при условии, что каждый круг принадлежит одной и той же категории.
Дополнительная информация здесь:
мое пошаговое руководство для столкновений и контактов: { ссылка }
И руководство по битовым маскам коллизий и тестов контактов: { ссылка }
Манипулирование битовыми масками для отключения отдельных контактов и контактов столкновения и на. { ссылка }