2016-06-15 26 views
0

截至目前,我有一個SKSpriteNode,可以檢測我的球與我的球碰撞,並在我們的分數相撞時增加+1。在碰撞中,也是檢測我的球是否撞牆的代碼。衝突檢測中斷另一次碰撞檢測 - 斯威夫特

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() 
     } 
    } 
} 

我需要與上述代碼完全分開的第二次碰撞檢測^^。我如何讓他們分開?你不能有兩個didBeginContact我不認爲。我希望這不是太模糊或不清楚。所以顯然我需要第二個節點,稱它爲colorNode。我如何檢測到我的球和colorNode(colorNode在我的scoreNode下面大約200像素,所以它們不在同一位置)之間的碰撞,而不會搞亂我的代碼來檢測球和牆之間的碰撞?

回答

0

您不需要單獨的碰撞檢測。你需要做的是處理didBeginContact中的事情。所有這些if-else檢查他們的||和& &變得相當笨拙。 (例如,您的最後一個else執行的檢查已在前else中執行)。

下面的代碼是一個OK-ish嘗試使if邏輯更明智。創建Bool處理存在每個我們感興趣的類型。

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 

現在,這種邏輯已經在一個相當合理的方式你來的實際定義碰撞檢查,你真的收穫獎勵:

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() 
     } 
    } 
} 

這應該使它更容易處理另一個球與某些碰撞。你只需要一個PhysicsCat.Color和另一個Bool。然後再掛上另一個else if

else if colorWasContacted { 
      // Do stuff 
     } 

注意:遵守慣例也是一個好主意。我在想你的命名,不要縮寫詞。 scoreLabel不是scoreLblPhysicsCategory不是PhysicsCat *

* PhysicsCat?那是施羅丁格先生的寵物嗎?