2016-06-15 29 views
0

現在のところ、私はボールとの衝突を検出し、衝突したときにスコアを+1するSKSpriteNodeを持っています。また、衝突には、ボールが壁に当たったかどうかを検出するコードがあります。別の衝突検出を中断する衝突検出 - 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() 
     } 
    } 
} 

私は上記のコードとは完全に別の2番目の衝突検出が必要です^^。どのようにそれらを別々にするのですか?私はdidBeginContactを2つ持つことはできません。私はこれがあまりにもあいまいでも不明瞭でもないと願っています。だから明らかに私はそれをcolorNodeと呼ぶ2番目のノードが必要です。私のボールとcolorNode(colorNodeは私のscoreNodeの約200ピクセル下にあり、同じ位置にないので、ボールと壁の衝突を検出するコードを乱すことはありません)との衝突をどうやって検出しますか?

答えて

0

別の衝突検出は必要ありません。あなたがする必要があるのは、didBeginContactのものを扱うことです。これらのすべてのif-elseチェックはその|| & &はかなり扱いにくくなります。 (あなたの最後のelseがすでに前のelseで実行されたチェックを実行していることを示しています)。

以下のコードは、if-logicをより合理的にするためのOK-ishの試みです。私たちが興味を持っているタイプごとに存在することを処理するため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 not scoreLblPhysicsCategory not PhysicsCat *

* PhysicsCat? Schroedinger氏の後期ペットですか?