2017-08-18 3 views
1

Il y a 3 SKSpriteNode dans ma classe SKScene. L'un d'eux est joueur et les autres sont en or et objet de finition invisible comme lorsque le joueur le touche, le jeu est terminé. Mon problème est que lorsque le joueur entre en collision avec l'or, son budget en or devrait augmenter de seulement 50 pièces d'or. Cependant, Xcode détecte plusieurs collisions et le budget d'or augmente plusieurs fois. 50-60 collision est détectée au lieu d'une collision. J'ai étudié comment résoudre ce problème. J'ai trouvé que je devrais utiliser Bool, j'ai essayé de définir bool mais cela n'a pas résolu mon problème. Est-ce que quelqu'un peut m'aider sur la façon de détecter une seule collision? Voici les codes de ma classe GameScene:SpriteKit détectant plusieurs collisions au lieu d'une seule fois (Swift 3)

import SpriteKit 
import GameplayKit 

class level3: SKScene, SKPhysicsContactDelegate { 

    let playerFileName = "player" 
    let starFileName = "50Gold" 
    let goalFileName = "goal" 
    let playerCategory : UInt32 = 0x1 << 1 
    let goalCategory : UInt32 = 0x1 << 2 
    let starCategory : UInt32 = 0x1 << 3 

    override func didMove(to view: SKView) { 
     super.didMove(to: view) 
     physicsWorld.contactDelegate = self 

     let goal = childNode(withName: goalFileName) as! SKSpriteNode 
     let player = childNode(withName: playerFileName) as! SKSpriteNode 
     let star = childNode(withName: starFileName) as! SKSpriteNode 

     player.physicsBody!.categoryBitMask = playerCategory 
     goal.physicsBody!.categoryBitMask = goalCategory 

     star.physicsBody?.collisionBitMask = 1 
     player.physicsBody?.collisionBitMask = 1 
     goal.physicsBody?.collisionBitMask = 1 
     goal.physicsBody?.isDynamic = true 

     goal.physicsBody!.contactTestBitMask = playerCategory 

     player.physicsBody?.isDynamic = true 
     star.physicsBody?.isDynamic = true 
     player.physicsBody?.contactTestBitMask = starCategory 

     star.physicsBody?.categoryBitMask = starCategory 

     func didBegin(_ contact: SKPhysicsContact) { 

      // 1 
      var firstBody: SKPhysicsBody 
      var secondBody: SKPhysicsBody 
      // 2 
      if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
       firstBody = contact.bodyA 
       secondBody = contact.bodyB 
      } else { 
       firstBody = contact.bodyB 
       secondBody = contact.bodyA 
      } 

      if firstBody.categoryBitMask == playerCategory && secondBody.categoryBitMask == goalCategory { 

       contact.bodyB.node?.removeFromParent() 

      } 

      if firstBody.categoryBitMask == playerCategory && secondBody.categoryBitMask == starCategory { 

       PlaySceneViewController.instance.gold += 50 
       print(PlaySceneViewController.instance.gold) 

       contact.bodyB.node?.removeFromParent() 

      } 

     } 
    } 
} 
+0

Suppression du tag Xcode et référence dans le titre, car cela est un problème que vous rencontrez la mise en œuvre quelque chose avec SpriteKit, pas un problème avec il Xcode IDE –

+0

Check ma réponse à une question très similaire ici: https://stackoverflow.com/a/44384390/1430420 –

Répondre

0

Oui, cela se produit. La façon de le gérer (vous ne pouvez pas obtenir sprite-kit pour ne PAS appeler didBegin plusieurs fois dans certaines circonstances) est de s'assurer que votre code de contact s'adapte à cela et que la gestion du contrat plusieurs fois ne pose pas de problème (comme l'ajout au score plusieurs fois, en supprimant plusieurs vies, en essayant d'accéder à un nœud ou physicsBody qui a été supprimé, etc.).

Pour plus de détails et les solutions possibles, voir cette réponse: https://stackoverflow.com/a/44384390/1430420

+0

Je connais cette discussion, mais elle ne peut pas m'aider à résoudre mon problème. Pouvez-vous expliquer comment je peux définir zéro pour cette collision si firstBody.categoryBitMask == playerCategory && secondBody.categoryBitMask == starCategory {} – uzaylibeyb