2016-10-27 6 views
-1

何らかの理由で2つのスプライト(この場合は忍者と左右の壁)の接触が認識されません。だから私の質問は何が欠けているのですか?私は衝突のカテゴリを追加し、それらはそれに応じてSpriteKitは連絡先を認識しません

func didBegin(_ contact: SKPhysicsContact) { 

    let nodeB = contact.bodyB.node! 

    if nodeB.name == "RIGHT_WALL" { 

     print("right wall touched") 
     RightWallTouched = true 
     self.CurrentScore = self.CurrentScore + 1 

    } 
    if nodeB.name == "LEFT_WALL" { 

     print("left wall touched") 
     RightWallTouched = false 
     self.CurrentScore = self.CurrentScore + 1 

    } 

    self.CurrentScoreLabel.text = "\(self.CurrentScore)" 

    if nodeB.name == "SPIKE" { 

     self.GameStarted = false 
     if(CurrentScore > HighScore){ 
      defaults.set(CurrentScore, forKey: self.HighScoreStorageKey) 
      defaults.synchronize() 
      self.HighScoreLabel.text = "\(self.defaults.integer(forKey: self.HighScoreStorageKey))" 
     } 
     endGame() 
    } 
} 




func CreateNinja(){ 

    let ninjaTexture = SKTexture(imageNamed: "ninja-right.png") 
    ninjaTexture.filteringMode = .nearest 
    self.ninja = SKSpriteNode(texture: ninjaTexture) 
    self.ninja!.physicsBody = SKPhysicsBody(texture: ninjaTexture, size: ninja!.size) 
    self.ninja?.name = "NINJA" 
    self.ninja!.physicsBody?.isDynamic = false 
    self.ninja!.physicsBody?.allowsRotation = false 
    self.ninja!.physicsBody?.restitution = 0.6 
    self.ninja!.physicsBody?.mass = 0.430 // m = 430g 
    self.ninja!.position = CGPoint(x: self.frame.size.width/2 , y: self.frame.size.height/5) 
    self.ninja!.physicsBody?.categoryBitMask = ninjaCollisionCategory 
    self.ninja!.physicsBody?.contactTestBitMask = 0 
    self.ninja!.physicsBody?.collisionBitMask = wallCollisionCategory 
    self.addChild(self.ninja!) 
} 


func CreateWall(){ 

    let topwall = SKSpriteNode() 
    topwall.name = "TOP_WALL" 
    topwall.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.frame.size.width, height: 5)) 
    topwall.physicsBody?.categoryBitMask = wallCollisionCategory 
    topwall.physicsBody?.isDynamic = false 
    topwall.physicsBody?.restitution = 0.6 
    topwall.position = CGPoint(x: self.frame.size.width/2.0 , y: self.frame.size.height) 
    topwall.physicsBody?.friction = 0 
    topwall.zPosition = 4 
    self.addChild(topwall) 

    let leftwall = SKSpriteNode(color: UIColor.black, size: CGSize(width: 20, height: self.frame.size.height)) 
    leftwall.name = "LEFT_WALL" 
    leftwall.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 20, height: self.frame.size.height)) 
    leftwall.physicsBody?.categoryBitMask = wallCollisionCategory 
    leftwall.physicsBody?.contactTestBitMask = 0 
    leftwall.physicsBody?.isDynamic = false 
    leftwall.position = CGPoint(x: 0 , y: self.frame.size.height/2.0) 
    leftwall.zPosition = 4 
    leftwall.physicsBody?.restitution = 1.0 
    leftwall.physicsBody?.friction = 0 
    self.addChild(leftwall) 

    let rightwall = SKSpriteNode(color: UIColor.black, size: CGSize(width: 20, height: self.frame.size.height)) 
    rightwall.name = "RIGHT_WALL" 
    rightwall.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 20, height: self.frame.size.height)) 
    rightwall.physicsBody?.categoryBitMask = wallCollisionCategory 
    rightwall.physicsBody?.contactTestBitMask = 0 
    rightwall.physicsBody?.isDynamic = false 
    rightwall.physicsBody?.restitution = 1.0 
    rightwall.physicsBody?.friction = 0 
    rightwall.position = CGPoint(x: self.frame.size.width , y: self.frame.size.height/2.0) 
    rightwall.zPosition = 4 
    self.addChild(rightwall) 
} 
+2

がどのようにノードBが知っていることができます例えば、小さな文字で開始する必要があります壁?あなたが知っている限り、ノードAは壁です。また、 'self.ninja!.physicsBody?.contactTestBitMask = 0'は、忍者が何も連絡できないことを意味します。 – Knight0fDragon

+0

はい、あなたは正しいです、単純なif文で問題を解決しました。ありがとうございました! –

+0

しかし、私は右の壁に接触するときにそれは2点としてカウントしますが、それは左の壁に1点のo.O –

答えて

1

あなたはまた、

physicsWorld.contactDelegate = self 
didMoveToViewにデリゲートを設定する必要があり、この

func didBegin(_ contact: SKPhysicsContact) { 
    let firstBody: SKPhysicsBody 
    let secondBody: SKPhysicsBody 

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 
    } else { 
     firstBody = contact.bodyB 
     secondBody = contact.bodyA 
    } 

    // Ninja hit wall or wall hit ninja 
    if (firstBody.categoryBitMask == ninjaCollisionCategory) && (secondBody.categoryBitMask == wallCollisionCategory) { 

     // Do something for all walls 
     ... 

     // you can also check the name for some specific wall e.g. 
     if secondBody.node?.name == "RIGHT_WALL" { 
       // hit right wall 
     } 
    } 
} 

ようなものになるだろうコリジョン機能を行うために、より一般的な方法を割り当て

おそらく、忍者のスプライトフィジックスボディをダイナミックに設定する必要があります

ninja?.physicsBody?.isDynamic = true // You can also remove this line as its set to true by default 

最後に、良いプラクティスとして、スウィフトのガイドラインに従うことをしようと、あなたの機能とプロパティはない大文字が

var currentScore = 0 
func createNinja() { ... } 

ホープこれは

+0

重力を避けるために "isDynamic"をfalseに設定しても、両方のカテゴリが同時に衝突するのを確認できます。 – Dewan

関連する問題