Проблема, вероятно, в следующих строках:
brickTop.physicsBody?.contactTestBitMask = PhysicsCategories.basicTopCategory
brickTop.physicsBody?.contactTestBitMask = PhysicsCategories.basicBottomCategory
brickTop.physicsBody?.contactTestBitMask = PhysicsCategories.basicLeftCategory
brickTop.physicsBody?.contactTestBitMask = PhysicsCategories.basicRightCategory
В этом коде битовая маска контакта заканчивается просто как basicRight. Вы хотите объединить их. Предполагается, что вы правильно настроили категории для начала (как 1, 2, 4, 8 и т. Д. c)
Вы хотите, чтобы это было больше похоже на это:
brickTop.physicsBody?.contactTestBitMask = PhysicsCategories.basicTopCategory |
PhysicsCategories.basicBottomCategory |
PhysicsCategories.basicLeftCategory |
PhysicsCategories.basicRightCategory
Вот как это должно работать
- У вас есть несколько узлов в вашей сцене
- Вы группируете их по категориям с похожим поведением
- Вы создаете перечисление / значение категории для каждой категории в виде бита в маске (1, 2, 4 и т. д. c), который равен (0x1 << 0, 0x1 << 1, 0x1 << 2) </li>
- Вы помещаете узлы в категории (используя
|
для объединения значений категорий) - Вы устанавливаете битовые маски contactTest и collisionDetect (используя
|
для объединения значений категорий)
Я не знаю, как должна работать ваша игра, но есть несколько вещей, которые выглядят странно в вашем коде.
- Вы используете одно и то же число для разных категорий
- Вы не объединяйте их в битовые маски.
Представьте, что у меня есть игра Понг. Я хочу определить, когда мяч ударяется о
- Боковые стенки, чтобы отскочить от него
- Верх и низ экрана, чтобы записать
- Весла, чтобы отскочить от него
Узлы
- шар
- левая стена
- правая стена
- низ
- верх
- верхнее весло
- нижнее весло
- игрок 1 счет
- игрок 2 счет
Категории (это только пример - это не единственный способ)
- CategoryNone: 0
- CategoryGamePiece: 1
- CategoryOutDetector: 2
- CategoryNonInteractive: 4 (используется для узлы счета)
Мяч отскакивает от лопастей и боковых стенок. Он также взаимодействует с невидимыми извещателями сверху и снизу. Он подразделяется на две категории (используя |
)
ball.categoryBitMask = CategoryGamePiece | CategoryOutDetector
ball.collisionBitMask = CategoryGamePiece
ball.contactTestBitMask = CategoryOutDetector
Весло и боковая стенка взаимодействуют только с мячом как игровой элемент (столкновение)
paddleTop.categoryBitMask = CategoryGamePiece
paddleTop.collisionBitMask = CategoryGamePiece
paddleTop.contactTestBitMask = CategoryNone
leftWall.categoryBitMask = CategoryGamePiece
leftWall.collisionBitMask = CategoryGamePiece
leftWall.contactTestBitMask = CategoryNone
Дно взаимодействует только с мячом в качестве контактного теста (не меняет своего движения)
bottomOut.categoryBitMask = CategoryOutDetector
bottomOut.collisionBitMask = CategoryNone
bottomOut.contactTestBitMask = CategoryOutDetector