2015-03-03 3 views
1

Я хотел бы иметь возможность определить, какой именно целевой узел спрайта попадает, когда пользователь бросает другой спрайт в группу целевых спрайтов. Вот как я настраивал свои спрайты под функцией didMoveToView (только в том числе соответствующих строк кода здесь)Определите, какой узел спрайта был удален

let flingerTexture = SKTexture(imageNamed: "flinger") 
flingerNode.position = CGPoint(x: 768, y: 440) 
flingerNode.physicsBody = SKPhysicsBody(texture: flingerTexture, size: flingerNode.size) 
flingerNode.physicsBody?.dynamic = true 
flingerNode.physicsBody!.categoryBitMask = PhysicsCategory.Flinger 
flingerNode.physicsBody!.collisionBitMask = PhysicsCategory.Edge | PhysicsCategory.Bubble | PhysicsCategory.Ball 
flingerNode.physicsBody?.contactTestBitMask = PhysicsCategory.Ball 
let rotationConstraint = SKConstraint.zRotation(SKRange(lowerLimit: -π/4, upperLimit: π/4)) 
flingerNode.constraints = [rotationConstraint] 
addChild(flingerNode) 

// -------------Setup targets--------------- 
let range: Range<Int> = 1...10 
for numbers in range { 
    let ballNode: BallNode = BallNode(imageNamed: "\(numbers)a") 
    let positionX = CGFloat.random(min: size.width/6, max: size.width * 5/6) 
    let positionY = CGFloat.random(min: size.height * 4/9, max: size.height * 8/9) 
    ballNode.position = CGPoint(x: positionX, y: positionY) 
    ballNode.name = "Ball" 
    ballNode.ballIndex = Int(numbers) 
    index = ballNode.ballIndex 
    ballNode.ballHit = false 
    addChild(ballNode) 

    ballNode.physicsBody = SKPhysicsBody(circleOfRadius: 100) 
    ballNode.physicsBody!.affectedByGravity = false 
    ballNode.physicsBody?.dynamic = true 
    ballNode.physicsBody!.restitution = 0.5 
    ballNode.physicsBody!.friction = 0.0 
    ballNode.physicsBody!.categoryBitMask = PhysicsCategory.Ball 
    ballNode.physicsBody!.collisionBitMask = PhysicsCategory.Ball | PhysicsCategory.Bubble | PhysicsCategory.Edge | PhysicsCategory.Flinger | PhysicsCategory.Wall 
    ballNode.physicsBody?.contactTestBitMask = PhysicsCategory.Flinger 

    ballNode.userData = NSMutableDictionary() 
    ballArray.append(ballNode.ballIndex) 
} 

я в состоянии обнаружить коллизию, но я не смог получить дополнительную USERDATA, что бы определить какие именно ballNode был поражен. Когда я попробовал следующий код, он возвращает только вывод «nil».

func didBeginContact(contact: SKPhysicsContact!) { 
let collision = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask 
if collision == PhysicsCategory.Flinger | PhysicsCategory.Ball { 
println(ballNode.userData) 
} 
} 

ответ

1

Я предполагаю, что PhysicsCategory.Flinger меньше PhysicsCategory.Ball. Затем в didContactBegan вы можете использовать этот код.

func didBeginContact(contact: SKPhysicsContact) { 

    var body1 : SKPhysicsBody! 
    var body2 : SKPhysicsBody! 

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
     body1 = contact.bodyA 
     body2 = contact.bodyB 
    } 
    else { 
     body1 = contact.bodyB 
     body2 = contact.bodyA 
    } 

    if body1.categoryBitMask == PhysicsCategory.Flinger && 
     body2.categoryBitMask == PhysicsCategory.Ball { 

      if let ballNode = body2.node { 

       println(ballNode.userData) 
      } 
    } 

} 

условие должно быть отменено, если PhysicsCategory.Flinger больше PhysicsCategory.Ball.

if body1.categoryBitMask == PhysicsCategory.Ball && 
    body2.categoryBitMask == PhysicsCategory.Flinger { 

     if let ballNode = body1.node { 

      println(ballNode.userData) 
     } 
} 
+0

Да @rakeshbs, ваше предположение верно. Но когда я пытаюсь использовать код, который вы предлагаете, вывод «Необязательно» ({}) ' – tolkienfan2

+0

И просто чтобы убедиться, что я сам не ошибаюсь в этом предположении, если я все-таки попробую отмененное условие, вывод будет «nil». – tolkienfan2

+0

Я думаю, что проблема имеет какое-то отношение к тому, как добавить userData для каждого узла, как вызвано в функции moveToView? Но я не знаю, как это разрешить. – tolkienfan2

0

Большое спасибо за указание меня в правильном направлении @rakeshbs! Ваш метод didBeginContact работает - проблема в том, что я не добавлял userData правильно. Я решил это, добавив следующую строку в мою функцию didMoveToView:

ballNode.userData = ["ballNumber" : ballNode.ballIndex] 
Смежные вопросы