2016-06-15 13 views
0

Ab sofort habe ich einen SKSpriteNode, der Kollisionen mit meinem Ball erkennt und meine Punktzahl um +1 erhöht, wenn sie kollidieren. Auch in der Kollision ist der Code, der erkennt, wenn mein Ball eine Wand trifft.Kollisionserkennung unterbricht eine andere Kollisionserkennung - Swift

let scoreNode = SKSpriteNode() 

    scoreNode.size = CGSize(width: 750, height: 10) 
    scoreNode.position = CGPoint(x: self.frame.width/2, y: self.frame.height/2 + 100) 
    scoreNode.physicsBody = SKPhysicsBody(rectangleOfSize: scoreNode.size) 
    scoreNode.physicsBody?.affectedByGravity = false 
    scoreNode.physicsBody?.dynamic = true 
    scoreNode.physicsBody?.categoryBitMask = PhysicsCat.Score 
    scoreNode.physicsBody?.collisionBitMask = 0 
    scoreNode.physicsBody?.contactTestBitMask = PhysicsCat.Ball 
    scoreNode.color = SKColor.clearColor() 

func didBeginContact(contact: SKPhysicsContact) { 


    let firstBody = contact.bodyA 
    let secondBody = contact.bodyB 



    if firstBody.categoryBitMask == PhysicsCat.Score && secondBody.categoryBitMask == PhysicsCat.Ball{ 

     score += 1 
     scoreLbl.text = "\(score)" 
     firstBody.node?.removeFromParent() 


    } 

    else if firstBody.categoryBitMask == PhysicsCat.Ball && secondBody.categoryBitMask == PhysicsCat.Score { 

     score += 1 
     scoreLbl.text = "\(score)" 
     secondBody.node?.removeFromParent() 


    } 
    else if firstBody.categoryBitMask == PhysicsCat.Ball && secondBody.categoryBitMask == PhysicsCat.Wall || firstBody.categoryBitMask == PhysicsCat.Wall && secondBody.categoryBitMask == PhysicsCat.Ball{ 

     enumerateChildNodesWithName("wallPair", usingBlock: ({ 
      (node, error) in 

      node.speed = 0 
      self.removeAllActions() 

     })) 

     if died == false{ 
      died = true 
      createBTN() 
      fallDie() 
     } 
    } 

    else if firstBody.categoryBitMask == PhysicsCat.Ball && secondBody.categoryBitMask == PhysicsCat.Wall { 

     enumerateChildNodesWithName("wallPair", usingBlock: ({ 
      (node, error) in 

      node.speed = 0 
      self.removeAllActions() 

     })) 
     if died == false{ 
      died = true 
      Ball.physicsBody?.velocity = CGVectorMake(0, 0) 

      createBTN() 
     } 
    } 
} 

Ich brauche eine zweite Kollisionserkennung, die vollständig von dem obigen Code ^^ getrennt ist. Wie mache ich sie getrennt? Du kannst nicht zwei didBeginContact haben, denke ich nicht. Ich hoffe, das ist nicht zu vage oder unklar. Also brauche ich natürlich einen zweiten Knoten, den ich colorNode nenne. Wie würde ich eine Kollision zwischen meinem Ball und colorNode feststellen (colorNode ist etwa 200 Pixel unter meinem scoreNode, also sind sie nicht in der gleichen Position), ohne meinen Code, der eine Kollision zwischen dem Ball und der Wand erkennt, zu vermasseln?

Antwort

0

Sie benötigen keine separate Kollisionserkennung. Was Sie tun müssen, ist die Dinge in didBeginContact zu behandeln. Alle diese Wenn-sonst-Prüfungen mit ihren || und & & wird ziemlich unhandlich. (Beispiel: Ihre letzte else führt eine Überprüfung durch, die bereits in der früheren else durchgeführt wurde).

Der folgende Code ist ein OK-ish Versuch, die if-Logik sinnvoller zu machen. eine Bool Erstellen der Gegenwart für jede der verschiedenen Arten zu behandeln, in der wir interessiert sind.

func didBeginContact(contact: SKPhysicsContact) { 
    let firstBody = contact.bodyA 
    let secondBody = contact.bodyB 

    let ballWasContacted = firstBody.categoryBitMask == PhysicsCat.Ball || secondBody.categoryBitMask == PhysicsCat.Ball 
    let wallWasContacted = firstBody.categoryBitMask == PhysicsCat.Wall || secondBody.categoryBitMask == PhysicsCat.Wall 
    let scoreWasContacted = firstBody.categoryBitMask == PhysicsCat.Score || secondBody.categoryBitMask == PhysicsCat.Score 

Nun, da diese Logik hat in einem ziemlich angemessenen Art und Weise definiert man zum eigentlichen kommen kollisions Überprüfung, wo Sie wirklich ernten die Früchte:

if ballWasContacted { 
    if scoreWasContacted { 
     score += 1 
     scoreLbl.text = "\(score)" 
     let scoreNode = firstBody.categoryBitMask == PhysicsCat.Score ? firstBody.node : secondBody.node 
     scoreNode!.removeFromParent() 
    } else if wallWasContacted { 
     enumerateChildNodesWithName("wallPair", usingBlock: ({ 
      (node, error) in 
      node.speed = 0 
      self.removeAllActions() 
     })) 
     if died == false { 
      died = true 
      createBTN() 
      fallDie() 
     } 
    } 
} 

Dieses es viel machen sollten leichter einen anderen Ball gegen etwas Kollision zu behandeln. Sie brauchen nur einen PhysicsCat.Color und einen weiteren Bool. Dann haken Sie einfach einen weiteren else if auf den letzten.

else if colorWasContacted { 
      // Do stuff 
     } 

Hinweis: Es ist eine gute Idee, auch Konventionen zu befolgen. Ich denke über deine Namensgebung nach, kürzere Wörter nicht ab. scoreLabel nicht scoreLblPhysicsCategory nicht PhysicsCat *

* PhysicsCat? Ist das spätes Haustier von Herrn Schroedinger?