Попробуйте закомментировать эту строку:
ball.physicsBody?.collisionBitMask = PhysicsCategories.none
, которая предотвращает столкновение мяча с чем-либо, т.е. на него не влияют столкновения с любым объектом.Примечание - это НЕ означает, что столкновение с мячом не влияет на другие объекты.Столкновение двухстороннее - учитывая 2 узла A и B, вы должны определить, сталкивается ли A с B и , если B сталкивается с A. Это не обязательно для контакта - достаточно определить, что контакты AB. Если на самом деле b переходит в A, didBegin()
все равно будет вызвано.Вы не должны определять этот контакт B также.
Вы, похоже, не установили collisionBitMask
на любом другом физическом теле, что означает, что они будут сталкиваться со всем.
это объясняет, почему шар движется сквозь стену - потому что он нене сталкивается с ним, хотя каждый другой объект должен толкаться мячом.
Попробуйте ввести:
print("Contact")
в качестве первой строки вашего didBegin()
, чтобы увидеть, есть ликонтакты регистрируются.
Если вы хотите перетащить спрайты пальцем, то заставить их отскочить (столкнуться) с другими спрайтами может быть непросто, поскольку перетаскивание подразумевает, что вы хотите установить их положение вручную, а отскоки подразумеваютчто вы хотите, чтобы спрайты перемещались с помощью движка Sprite-Kit, а 2 не совместимы на самом деле.
Вероятно, стоит указать, что «столкновения» - это спрайты, отскакивающие друг от друга и обрабатываемые движком SK,collisionBitMask
контролирует, какие объекты отскакивают друг от друга.
«Контакты» - это просто способ получать уведомления при касании 2 объектов.Они контролируются contactTestBitMask
.
Как контакт, так и коллизии полагаются на categoryBitMAsk
Моё пошаговое руководство для коллизий и контактов: https://stackoverflow.com/a/51041474/1430420
И руководство по коллизиям и контактамбитовые маски: https://stackoverflow.com/a/40596890/1430420
Управление битовыми масками для включения и выключения отдельных столкновений и контактов.https://stackoverflow.com/a/46495864/1430420