2017-03-28 2 views
2

Ich habe ein SpriteKit-Spiel, in dem Sie Asteroiden abschießen müssen, bevor sie die Basis treffen. Aber wenn Sie schießen und den Asteroiden und/oder die Basis treffen, wenn der Asteroid die Basis trifft, stürzt das Programm ab.SpriteKit-Spiel stürzt ab, wenn zwei SKPhysicsContacts erkannt werden

Hier ist meine Physik Kontaktcode.

public func didBegin(_ contact: SKPhysicsContact) { 

    //Asteroid is object 1, other item is object 2 

    var object1 = SKSpriteNode() 
    var object2 = SKSpriteNode() 

    //Test for asteroid/projectile contact, then remove appropriate sprites, change game values and play sounds 

    if contact.bodyA.contactTestBitMask == ColliderType.Asteroid.rawValue && contact.bodyB.contactTestBitMask == ColliderType.Asteroid.rawValue{ 

     if contact.bodyA.categoryBitMask == ColliderType.Asteroid.rawValue{ 


     }else if contact.bodyB.categoryBitMask == ColliderType.Asteroid.rawValue{ 

      object2 = contact.bodyA.node as! SKSpriteNode 
      object1 = contact.bodyB.node as! SKSpriteNode 

      let explosionPath = URL(fileURLWithPath: Bundle.main.path(forResource: "astd", ofType: "m4a")!) 

      do { 
       audioPlayer = try AVAudioPlayer(contentsOf: explosionPath) 
      } catch { 
       print("error") 
      } 

      audioPlayer.prepareToPlay() 
      audioPlayer.play() 

     } 

     if object2.physicsBody?.categoryBitMask == ColliderType.Object.rawValue{ 


      object1.removeAllActions() 
      object1.removeFromParent() 

      let hitPath = URL(fileURLWithPath: Bundle.main.path(forResource: "craftHit", ofType: "mp3")!) 

      do { 
       audioPlayer = try AVAudioPlayer(contentsOf: hitPath) 
      } catch { 
       print("error") 
      } 

      audioPlayer.prepareToPlay() 
      audioPlayer.play() 

      reduceHealthBy(num: 0.075) 



     }else if object2.physicsBody?.categoryBitMask == ColliderType.Projectile.rawValue{ 



      object1.removeAllActions() 
      object1.removeFromParent() 

      object2.removeAllActions() 
      object2.removeFromParent() 

      score += 1 

     } 
    } 
} 
+2

Was ist der Fehler? –

+0

Es ist auf Swift Playgrounds, also habe ich keinen Fehler bekommen, aber es stürzt einfach ab. Ich habe herum experimentiert und bin mir ziemlich sicher, dass es die multiplen Physikkontakte sind. – QPDev

Antwort

2

Klingt wie ein Duplikat Optional unwrapping SKPhysics error

SK wird mehrere Kontaktveranstaltungen für einen tatsächlichen Kontakt zu erzeugen und so didBegin() mehrmals aufgerufen wird.

Beim ersten Aufruf von didBegin behandeln Sie den Kontakt und entfernen einen oder Modusknoten usw., und beim zweiten Aufruf von didBegin (mit dem gleichen contact: -Argument) sind die entfernten Knoten jetzt null, also wenn Sie versuchen entfernen oder referenzieren sie einen Absturz.

Es gibt mehrere Möglichkeiten, dieses so zu behandeln, wie die Knoten Hinzufügen zu einer Gruppe entfernt werden und das Entfernen sie dann in didFinishUpdate() oder zu überprüfen, ob ein Knoten gleich Null ist und dann zurückkehrt, wenn es usw.

Der Versuch, zu erhalten SK, die multiplen Kontakte NICHT zu generieren, scheint derzeit unerreichbar.

Verwandte Themen