Я пишу приложение 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. Я просто понятия не имею, как и почему. У кого-нибудь есть решение?
Возможный дубликат [начинающий быстрый комплект спрайтов - помощь по обнаружению столкновений узлов (SKPhysicsContact)] (http://stackoverflow.com/questions/26270504/beginner-swift-sprite-kit-node-collision-detection-help-skphysicscontact) – sangony
@sangony, проблема другая. В моем случае функция вызывается, даже если фактический контакт между двумя узлами отсутствует. –