2017-03-28 11 views
2

私はSpriteKitゲームを持っており、小惑星がベースに衝突する前にそれらを撃墜する必要があります。しかし、小惑星が塁に当たったときに小惑星や銃を撃って打つと、プログラムがクラッシュします。2つのSKPhysicsContactsが検出された場合、SpriteKitゲームがクラッシュする

ここに私の物理学のコンタクトコードがあります。

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

エラーは何ですか? –

+0

それはスウィフトプレイグラウンドにあるので、私はエラーを起こさなかったが、むしろそれはちょうどクラッシュする。私は実験したことがあり、それは複数の物理的接触であることは確かです。 – QPDev

答えて

2

Optional unwrapping SKPhysics error

SK一の実際の接点に対して複数の接触イベントを生成しているので、didBegin()が複数回呼び出されているの重複のように聞こえます。

didBeginの最初の呼び出しでは、連絡先を処理して1つまたはモードノードなどを削除し、didBegin(同じ連絡先:引数を使用)の2回目の呼び出しで、削除したノードはゼロになります。それらを削除または参照するとクラッシュします。

ようなセットに削除するノードを追加し、didFinishUpdate()でそれらを削除するか、チェックノードがnilであれば、その後、それが取得しようなど

であれば返すようにこれを処理するために、いくつかの方法があります複数の連絡先を生成しないSKは、現時点では実現不可能なようです。

関連する問題