2016-06-25 4 views
2

Функция my didBeginContact обнаруживает около 60 столкновений между двумя SKSpriteNodes, когда их должно быть только одно.Почему моя функция didBeginContact обнаруживает слишком много конфликтов?

func didBeginContact(contact: SKPhysicsContact) { 
    let firstBody = contact.bodyA 
    let secondBody = contact.bodyB 
    if firstBody.categoryBitMask == bulletCategory && secondBody.categoryBitMask == dragonCategory || firstBody.categoryBitMask == dragonCategory && secondBody.categoryBitMask == bulletCategory{ 

     print("collision happened") 
    } 
} 

Когда узлы входят в контакт, консоль печатает «столкновение» много раз.

Вот как я объявляю физика для каждого комбинезоны SKSpriteNode

dragonNode.physicsBody = SKPhysicsBody(texture: dragonNode.texture!, size: CGSizeMake(dragonNode.size.width, dragonNode.size.height)) 
dragonNode.physicsBody?.affectedByGravity = false    
dragonNode.physicsBody?.dynamic = true 
dragonNode.physicsBody?.categoryBitMask = dragonCategory 
dragonNode.physicsBody?.collisionBitMask = bulletCategory 
dragonNode.physicsBody?.contactTestBitMask = bulletCategory 

bulletNode.physicsBody = SKPhysicsBody(texture: texture, size: texture.size()) 
bulletNode.physicsBody?.affectedByGravity = false 
bulletNode.physicsBody?.dynamic = true 
bulletNode.physicsBody?.categoryBitMask = bulletCategory 
bulletNode.physicsBody?.collisionBitMask = dragonCategory 
bulletNode.physicsBody?.contactTestBitMask = dragonCategory 

Это одна из последних вещей, которые мне нужно исправить для моей игры будет завершена, так что если кто-то может помочь, что было бы здорово!

ответ

2

Это потому, что теоретически ваша игра работает со скоростью 60 кадров в секунду. Поэтому каждые 60 секунд он обнаруживает столкновение и печатает предупреждение. Вы не указали какой-либо код, чтобы сказать, что он остановил обнаружение этого столкновения. Вы всегда можете поставить флаг на объект

dragonNode.collided = true 

, а затем обнаруживать столкновения и флаг

if (firstBody.categoryBitMask == bulletCategory && secondBody.categoryBitMask == dragonCategory || firstBody.categoryBitMask == dragonCategory && secondBody.categoryBitMask == bulletCategory) && dragonNode.collided != true { 
    dragonNode.collided = true 
    print("collision happened") 
} 

таким образом столкновение только срабатывает один раз

+0

мне нужно установить dragonNode.collided на false, чтобы это можно было сбросить? –

+0

Там я добавил пример кода того, что вы можете сделать. Очевидно, вам придется создать свойство на dragonNode, которое вы можете написать (например, «collided») или найти другую переменную для записи для проверки. Вам также нужно будет найти способ сброса переменной, чтобы обнаружение могло быть обнаружено позже. –

+0

okay спасибо, что было действительно ясно –