Иногда в моих программах SpriteKit мои столкновения и контакты (используя SKPhysicsBody) не срабатывают или работают должным образом. Я думаю, что я создал все, что мне нужно, но я до сих пор не получаю правильных взаимодействий. Как я могу легко проверить, что столкнется с тем, что и какие органы настроены для создания контактов?iOS SpriteKit - столкновения и контакты не работают должным образом
ответ
Чтобы помочь диагностировать эти проблемы, я написал функцию, которая может быть вызвана из любого места и которая будет анализировать текущую сцену и составить список узлов, с которыми сталкиваются другие, и какие столкновения будут уведомлены о моей сцене для.
Функция автономна и не нуждается ни в чем в описании узлов в сцене.
Функция выглядит следующим образом:
//MARK: - Analyse the collision/contact set up.
func checkPhysics() {
// Create an array of all the nodes with physicsBodies
var physicsNodes = [SKNode]()
//Get all physics bodies
enumerateChildNodesWithName("//.") { node, _ in
if let _ = node.physicsBody {
physicsNodes.append(node)
} else {
print("\(node.name) does not have a physics body so cannot collide or be involved in contacts.")
}
}
//For each node, check it's category against every other node's collion and contctTest bit mask
for node in physicsNodes {
let category = node.physicsBody!.categoryBitMask
// Identify the node by its category if the name is blank
let name = node.name != nil ? node.name : "Category \(category)"
let collisionMask = node.physicsBody!.collisionBitMask
let contactMask = node.physicsBody!.contactTestBitMask
// If all bits of the collisonmask set, just say it collides with everything.
if collisionMask == UInt32.max {
print("\(name) collides with everything")
}
for otherNode in physicsNodes {
if (node != otherNode) && (node.physicsBody?.dynamic == true) {
let otherCategory = otherNode.physicsBody!.categoryBitMask
// Identify the node by its category if the name is blank
let otherName = otherNode.name != nil ? otherNode.name : "Category \(otherCategory)"
// If the collisonmask and category match, they will collide
if ((collisionMask & otherCategory) != 0) && (collisionMask != UInt32.max) {
print("\(name) collides with \(otherName)")
}
// If the contactMAsk and category match, they will contact
if (contactMask & otherCategory) != 0 {print("\(name) notifies when contacting \(otherName)")}
}
}
}
}
Вы также должны проверить эти 3 вещи:
- сцена должна быть
SKPhysicsContactDelegate
- Вы должны установить
physicsWorld.contactDelegate = self
- Вам необходимо реализовать один из необязательных методов:
SKPhysicsContactDelegate
:
didBeginContact
didEndcontact
Функция должна быть названа, как только вы настроили все ваши фотографии - как правило, в конце didMoveToView
работ:
checkPhysics()
Когда я вызовите эту функцию с конца моего didMoveToView
в моей программе Swift, я получаю следующий вывод:
Дополнительно ("shape_blueSquare") сталкивается с факультативным ("Категория 2147483648") Дополнительно ("shape_blueSquare") сталкивается с Факультативным ("shape_redCircle") Дополнительно ("shape_blueSquare") сталкивается с Факультативным ("shape_purpleSquare") Дополнительно ("shape_blueSquare") сталкивается с факультативным ("shape_yellowTriangle") Опционально ("shape_redCircle") сталкивается с факультативным ("Категория 2147483648") Дополнительно ("shape_redCircle") сталкивается с факультативным ("shape_blueSquare") Дополнительно («shape_redCircle») уведомляет при обращении к Необязательный («shape_purpleSquare») Необязательный («shape_redCircle») сталкивается с опцией аль ("shape_yellowTriangle") Необязательный ("shape_redCircle") уведомляет при контакте с факультативным ("shape_yellowTriangle") Необязательный ("shape_purpleSquare") сталкивается с факультативным ("Категория 2147483648") Необязательный ("shape_purpleSquare") сталкивается с Факультативный ("shape_yellowTriangle") Дополнительно ("shape_yellowTriangle") сталкивается со всем didBeginContact введенным для Факультативного ("shape_purpleSquare") и необязательный ("shape_redCircle") didBeginContact вошел в Опционно ("shape_purpleSquare") и Дополнительно ("shape_redCircle") didBeginContact введено для Дополнительно («shape_yellowTriangle») и опционально («shape_redCircle»)
Категория 2147483648 - моя граница края, и у нее нет имени. Я дал ему эту категорию в соответствии с ее collisionBitMask
Пожалуйста, не стесняйтесь попробовать эту функцию и сообщите мне, если она полезна или если есть ситуации, с которыми она не справляется.
Это достойный инструмент для github! – Confused
Эти вопросы действительно подходят для [Обзор кода] (http://codereview.stackexchange.com/) – Whirlwind
Это подходит только для просмотра кода, если код работает должным образом, и если OP хочет получить обзор. .. Из звука этого вопроса он не хочет обзора, он хочет проверить ошибку своего кода ... –
На самом деле я не хочу, чтобы мой код рассматривался как OI, думаю, что он работает, но я пытался опубликовать что-то, что поможет людям с проблемами столкновения/контакта. Возможно, мне следовало бы задать вопрос о том, что у меня возникли проблемы, а затем моя функция checkPhysics в качестве ответа? –