2017-05-31 6 views
0

私は2人のシューティングゲームを作ろうとしています。私はすでに使用している弾丸を破壊しようとしています。アップデートで私はコードを使用しています致命的なエラーインデックスが範囲外です。Swift 3 SpriteKit

var bulletsChecked = 0 


    for b in bullets { 

     if b.pos.y > self.frame.height || b.pos.y < -self.frame.height { 

      bullets.remove(at: bulletsChecked) 

      print("destroy old bullets") 



     } 

また、アップデートの最後にbulletChecked + = 1があります。このコードは、プレーヤー1とプレーヤー2が同時に撮影しない限り正常に動作します。それから、「bullets.remove(at:bulletsChecked)」の「範囲外の致命的なエラーインデックス」エラーが表示されます。

+0

あなたが弾丸を削除すると、あなたは残りの弾丸のインデックスをオフに投げる間の衝突。修正するには2つの方法があります。1)箇条書きを削除していないときに増分のみをチェックします。または、2)あなたの配列の '(index、b)のためにbullets.enumerated()に逆方向に反復する(' {箇条書きが条件を満たす場合{bullets.remove(at:index)}} ' – vacawama

+0

あなたは2つのより良い方法で進むことができます:1)画面の物理ループを追加し、それに接触する弾を取り除く。 2)弾丸を撃つとき(私はapplyImpulseだと思います)、少し時間がたつと弾を取り除くSKActionのシーケンスを追加します。あなたのコード、使用するvar弾丸をmantainたい場合は=(を設定して)、今、あなたは –

答えて

1

あなたは逆の順序であなたの配列かかわらず行くことによって、インデックスの問題を回避することができます。

for b in bullets.reversed() { 
... 
} 

[編集]また、フィルタを使用して配列から弾丸を削除することもできます。例えば

:私は弾丸の削除のためのテストが必要な結果を生成する方法については明確ではないんだけど、私はそれはあなたがそれが何をしたいのかないこととそうでないことを前提としてい

bullets = bullets.filter 
{ 
    bullet in 
    return bullet.pos.y > self.frame.height 
     || bullet.pos.y < -self.frame.height 
}  

注意削除される予定のない箇条書きを削除してみてください。

+0

b.remove使用することができ、これは枠の外に出るボットの弾丸のために動作しますが、それらの両方がお互いを打つ場合、私は同じエラーを取得していただきありがとうございます。ここに私のコードは... – c3pNoah

0

// ====== BULLETTとプレイヤー2

 if canHitP2 { 

     if b.pos.y >= self.frame.height - P2.size.height && (b.pos.x >= P2.position.x - P2.size.width/2 && b.pos.x <= P2.position.x + P2.size.width/2){ 

      print("Player 2 hit") 

      bullets.remove(at: bulletsChecked) 

      P1Scored() 

      P2.removeFromParent() 

      P2CanShoot = false 

      canHitP2 = false 

      DispatchQueue.main.asyncAfter(deadline: Delay) { 

       self.P2Spawn() 

       self.addChild(self.P2) 

       P2CanShoot = true 

       canHitP2 = true 

      } 


     } 

     } 


     //====== COLLISION BETWEEN BULLETT AND PLAYER 1 

     if canHitP1 { 

     if b.pos.y <= -self.frame.height + P1.size.height && (b.pos.x >= P1.position.x - P1.size.width/2 && b.pos.x <= P1.position.x + P1.size.width/2) { 

      print("Player 1 hit") 

      bullets.remove(at: bulletsChecked) 

      P2Scored() 

      P1.removeFromParent() 

      P1CanShoot = false 

      canHitP1 = false 

      DispatchQueue.main.asyncAfter(deadline: Delay) { 

       self.P1Spawn() 

       self.addChild(self.P1) 

       P1CanShoot = true 

       canHitP1 = true 



      } 


     } 

     } 
関連する問題