2015-04-21 5 views
0

Я пишу приложение SpriteKit для Mac OS. У меня есть два объекта (метательные и монстр):сделалBeginContact работает без контакта swift

let suric = SKSpriteNode(imageNamed: "projectile.png") 
suric.position = player.position 
suric.physicsBody = SKPhysicsBody(circleOfRadius: self.size.width/2) 
suric.physicsBody?.categoryBitMask = Detection.suric 
suric.physicsBody?.collisionBitMask = Detection.no 
suric.physicsBody?.contactTestBitMask = Detection.monster 
suric.physicsBody?.usesPreciseCollisionDetection = true 
suric.physicsBody?.dynamic = true 

let offset = location - suric.position 
if offset.x < 0 { 
    return 
}  
addChild(suric) 
let direc = offset.normalized() 
let shoot = direc * 1000 
let dest = shoot + suric.position   
let move = SKAction.moveTo(dest, duration: 2.0) 
let stop = SKAction.removeFromParent() 
suric.runAction(SKAction.sequence([move, stop])) 

Монстр код:

структура
let monster = SKSpriteNode(imageNamed: "monster.png") 

let y = random(min: monster.size.height/2, size.height - monster.size.height) 
monster.position = CGPoint(x: self.size.width + monster.size.width/2, y: y) 
monster.physicsBody = SKPhysicsBody(rectangleOfSize: monster.size) 
monster.physicsBody?.usesPreciseCollisionDetection = true 
monster.physicsBody?.categoryBitMask = Detection.monster 
monster.physicsBody?.contactTestBitMask = Detection.suric 
monster.physicsBody?.collisionBitMask = Detection.no 
monster.physicsBody?.dynamic = true 
addChild(monster)  
let duration = random(min: 2.0, 4.0) 
let move = SKAction.moveTo(CGPoint(x: -monster.size.width/2, y: y), duration: NSTimeInterval(duration)) 
let done = SKAction.removeFromParent()  
monster.runAction(SKAction.sequence([move, done])) 

Детектирование:

struct Detection { 
    static var no : UInt32 = 0 
    static var all : UInt32 = UInt32.max 
    static var monster : UInt32 = 0b1 
    static var suric : UInt32 = 0b10 
} 

И тогда я стараюсь, чтобы проверить, есть ли контакт между эти 2 объекта:

func didBeginContact(contact: SKPhysicsContact) { 
    var first : SKPhysicsBody 
    var second : SKPhysicsBody 
    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
     first = contact.bodyA 
     second = contact.bodyB 
    } 
    else { 
     first = contact.bodyB 
     second = contact.bodyA 
    } 

    if (first.categoryBitMask & Detection.monster != 0) && (second.categoryBitMask & Detection.suric != 0) { 
     suricHit(first.node as? SKSpriteNode, monster: second.node as? SKSpriteNode) 
    } 
} 

Это работает, даже если они фактически не установили контакт. Например, снаряд находится около верхней части окна, монстр находится внизу, но эта функция работает.

EDIT:

Я добавил этот код didBeginContact:

let nodeA = (first.node as! SKSpriteNode) 
let nodeB = (second.node as! SKSpriteNode) 
println("\(nodeA.position)\t\(nodeA.size)") 
println("\(nodeB.position)\t\(nodeB.size)") 
println((contact.contactPoint)) 
println() 

примере отказа:

(510.201293945312, 285.025665283203) (54.0, 80.0) 
(532.54345703125, 378.878845214844) (20.0, 20.0) 
(852.469543457031, 530.415222167969) 

Как вы можете видеть, х положение узлов 510 и 532, но контактная точка x - 852. Я просто понятия не имею, как и почему. У кого-нибудь есть решение?

+0

Возможный дубликат [начинающий быстрый комплект спрайтов - помощь по обнаружению столкновений узлов (SKPhysicsContact)] (http://stackoverflow.com/questions/26270504/beginner-swift-sprite-kit-node-collision-detection-help-skphysicscontact) – sangony

+0

@sangony, проблема другая. В моем случае функция вызывается, даже если фактический контакт между двумя узлами отсутствует. –

ответ

0

В инструкции if отсутствует дополнительный набор круглых скобок.

if ((first.categoryBitMask & Detection.monster != 0) && (second.categoryBitMask & Detection.suric != 0)) { 
    suricHit(first.node as? SKSpriteNode, monster: second.node as? SKSpriteNode) 
} 

PS Я после этого учебника и поставить свой проект на GitHub, проверить это!

+0

Не работает вообще. Такое же поведение –

Смежные вопросы