2016-04-12 4 views
3

Иногда в моих программах SpriteKit мои столкновения и контакты (используя SKPhysicsBody) не срабатывают или работают должным образом. Я думаю, что я создал все, что мне нужно, но я до сих пор не получаю правильных взаимодействий. Как я могу легко проверить, что столкнется с тем, что и какие органы настроены для создания контактов?iOS SpriteKit - столкновения и контакты не работают должным образом

+0

Эти вопросы действительно подходят для [Обзор кода] (http://codereview.stackexchange.com/) – Whirlwind

+3

Это подходит только для просмотра кода, если код работает должным образом, и если OP хочет получить обзор. .. Из звука этого вопроса он не хочет обзора, он хочет проверить ошибку своего кода ... –

+0

На самом деле я не хочу, чтобы мой код рассматривался как OI, думаю, что он работает, но я пытался опубликовать что-то, что поможет людям с проблемами столкновения/контакта. Возможно, мне следовало бы задать вопрос о том, что у меня возникли проблемы, а затем моя функция checkPhysics в качестве ответа? –

ответ

4

Чтобы помочь диагностировать эти проблемы, я написал функцию, которая может быть вызвана из любого места и которая будет анализировать текущую сцену и составить список узлов, с которыми сталкиваются другие, и какие столкновения будут уведомлены о моей сцене для.

Функция автономна и не нуждается ни в чем в описании узлов в сцене.

Функция выглядит следующим образом:

  //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 вещи:

  1. сцена должна быть SKPhysicsContactDelegate
  2. Вы должны установить physicsWorld.contactDelegate = self
  3. Вам необходимо реализовать один из необязательных методов: 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

Пожалуйста, не стесняйтесь попробовать эту функцию и сообщите мне, если она полезна или если есть ситуации, с которыми она не справляется.

+1

Это достойный инструмент для github! – Confused