2017-08-18 4 views
1

Es gibt 3 SKSpriteNode in meiner SKScene-Klasse. Einer von ihnen ist Spieler und die anderen sind Gold und unsichtbare Finish-Objekt wie wenn Spieler es berühren, Spiel ist beendet. Mein Problem ist, dass wenn der Spieler mit dem Gold kollidiert, sein Goldbudget nur 50 Gold erhöhen sollte. Xcode erkennt jedoch Mehrfachkollisionen und Goldbudgets, die sich mehrfach erhöhen. Eine 50-60-Kollision wird anstelle einer Kollision erkannt. Ich habe erforscht, wie ich dieses Problem lösen kann. Ich fand, dass ich Bool benutzen sollte, ich habe versucht, bool zu setzen, aber es hat mein Problem nicht gelöst. Kann mir jemand helfen, wie man nur eine Kollision erkennt? Hier ist der meine GameScene Klassencodes:SpriteKit erkennt Mehrfachkollisionen statt einmal (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

Entfernen Xcode-Tages und im Titel, da dies ein Problem, das Sie mit SpriteKit Umsetzung etwas mit, kein Problem mit ihm Xcode IDE –

+0

prüfen meine Antwort auf eine sehr ähnliche Frage hier: https://Stackoverflow.com/a/44384390/1430420 –

Antwort

0

Ja - das passiert. Die Art und Weise, wie Sie damit umgehen können (Sie können nicht erreichen, dass sprite-kit didBegin in einigen Fällen nicht mehrmals aufruft), stellt sicher, dass Ihr Kontaktcode dies berücksichtigt und das mehrfache Bearbeiten des Vertrags kein Problem verursacht (z. B. Hinzufügen) um die Punktzahl mehrmals, Entfernen mehrerer Leben, versuchen, auf einen Knoten oder physicsBody zuzugreifen, die entfernt wurde usw.).

Für weitere Einzelheiten und mögliche Lösungen finden Sie diese Antwort: https://stackoverflow.com/a/44384390/1430420

+0

Ich weiß, dass Diskussion, aber es kann mir nicht helfen, mein Problem zu lösen. Kannst du erklären, wie ich für diese Kollision null setzen kann, wenn firstBody.categoryBitMask == playerCategory && secondBody.categoryBitMask == starCategory {} – uzaylibeyb

Verwandte Themen