2016-06-15 6 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() 
     } 
    } 
} 

위의 코드와 완전히 다른 두 번째 충돌 감지가 필요합니다 ^^. 어떻게 분리 할 수 ​​있습니까? 당신 did not는 2 개의 didBeginContact 's를 품을 수 없다 나는 생각하지 않는다. 나는 이것이 너무 애매하거나 분명하지 않기를 바란다. 그래서 분명히 colorNode라고하는 두 번째 노드가 필요합니다. 공과 벽 사이의 충돌을 감지하는 코드를 엉망으로 만들지 않고 colorNode와 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.ColorBool이 필요합니다. 그런 다음 또 다른 else if을 마지막으로 연결하십시오.

else if colorWasContacted { 
      // Do stuff 
     } 

참고 : 규칙을 준수하는 것이 좋습니다. 나는 당신의 명명에 대해 생각하고 있습니다, 단어를 생략하지 마십시오. scoreLabel not scoreLblPhysicsCategory not PhysicsCat *

* PhysicsCat? Schroedinger 씨의 늦은 애완 동물인가요?