2016-04-26 1 views
1

В моей игре, когда игра начинается, некоторые узлы уже находятся в контакте, но я не нахожу, как обнаружить эти контакты. Мне удается обнаружить контакты, которые происходят, когда узлы движутся и соприкасаются во время игры, используя функцию didBeginContact.SpriteKit/Swift - Как проверить контакт двух узлов, когда они уже находятся в контакте

У кого-нибудь есть идеи, как обнаружить эти контакты?

Вот мой didBeginContact, если это необходимо:

func didBeginContact(contact: SKPhysicsContact) { 

    var firstBody: SKPhysicsBody 
    var secondBody: SKPhysicsBody 
    if contact.bodyA.categoryBitMask == contact.bodyB.categoryBitMask { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 

     contactsList.append([firstBody.node!,secondBody.node!]) 
    } 
} 
+0

хороший вопрос, думаю, спрайт узлы, начиная игру, касаясь не работает с didBeginContact. Я думаю, что ваш единственный вариант - это didEndContact, но это не похоже на то, что вы хотите. – Steve

+0

Тестировали ли вы, если didBeginContact вызывается для 2 тел, уже трогающих? Логично, я бы подумал, что в течение самого первого прохода над сценой, если физический движок обнаружит, что 2 физических тела перекрываются, он будет называть didBeginContact. Затем он добавит эти тела в список и не вызовет didBeginContact на следующем проходе, если они все еще касаются, но вызовите didEndContact, если они больше не касаются и не удаляют их из списка. –

+0

Спасибо за ваши ответы, нет, к сожалению, не был вызванBeginContact. Я точно так же, как ты сказал! – Oscar

ответ

1

Я просто попытался сделать два спрайта перекрываться с самого начала и контакт обнаруживается для меня. Вот код:

import SpriteKit 

struct Collider { 
    static let SmallSquare  : UInt32 = 1 << 0 
    static let BigSquare  : UInt32 = 1 << 1 
} 

class GameScene: SKScene, SKPhysicsContactDelegate { 

    override func didMoveToView(view: SKView) { 

     self.physicsWorld.contactDelegate = self 

     let smallSquare = SKSpriteNode(color: .orangeColor(), size: CGSize(width: 50, height:50)) 
     smallSquare.zPosition = 2 
     smallSquare.position = CGPoint(x: frame.midX, y: frame.midY) 
     smallSquare.physicsBody = SKPhysicsBody(rectangleOfSize: smallSquare.size) 
     smallSquare.physicsBody?.affectedByGravity = false 
     smallSquare.physicsBody?.categoryBitMask = Collider.SmallSquare 
     smallSquare.physicsBody?.contactTestBitMask = Collider.BigSquare 
     smallSquare.physicsBody?.collisionBitMask = 0 
     addChild(smallSquare) 

     let bigSquare = SKSpriteNode(color: .purpleColor(), size: CGSize(width: 200, height: 200)) 
     bigSquare.zPosition = 1 
     bigSquare.position = CGPoint(x: frame.midX, y: frame.midY) 
     bigSquare.physicsBody = SKPhysicsBody(rectangleOfSize: bigSquare.size) 
     bigSquare.physicsBody?.affectedByGravity = false 
     bigSquare.physicsBody?.categoryBitMask = Collider.BigSquare 
     bigSquare.physicsBody?.contactTestBitMask = Collider.SmallSquare 
     bigSquare.physicsBody?.collisionBitMask = 0 
     addChild(bigSquare) 

    } 

    func didBeginContact(contact: SKPhysicsContact) { 

     print("Contact detected") 
    }  
} 

В дальнейшем, чтобы надлежащим образом обнаружить связь между определенными органами, вы должны сделать что-то вроде этого:

func didBeginContact(contact: SKPhysicsContact) { 

     var firstBody, secondBody: SKPhysicsBody 

     if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 

      firstBody = contact.bodyA 
      secondBody = contact.bodyB 
     } else { 

      firstBody = contact.bodyB 
      secondBody = contact.bodyA 
     } 


     if ((firstBody.categoryBitMask & Collider.SmallSquare) != 0 && 
      (secondBody.categoryBitMask & Collider.BigSquare != 0)) { 

       print ("Contact detected") 
     } 

    } 

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