2017-05-31 53 views
0

我正在嘗試製作雙人射擊遊戲。我試圖摧毀你已經使用過的子彈。在更新我使用的代碼致命錯誤索引超出範圍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") 



     } 

我也有bulletsChecked + = 1在更新結束。此代碼工作正常,除非玩家一和玩家二同時拍攝。然後我得到「bullets.remove(at:bulletsChecked)」上的「致命錯誤索引超出範圍」錯誤「任何想法?

+0

當你刪除一顆子彈,你甩開剩餘子彈的指標。兩種修復方法1)只有當你沒有刪除子彈時才增加子彈檢查。或者2)向後遍歷你的數組'for(index,b)in bullets.enumerated()。reversed(){if bullet met criteria {bullets.remove(at:index)}}' – vacawama

+0

如果你想刪除在屏幕之外,您可以採用兩種更好的方式:1)添加屏幕的物理循環並移除與其接觸的子彈。 2)當你射擊子彈(我認爲是applyImpulse)時,添加一段SKAction,在延遲一段時間後刪除子彈。如果你想保持你的代碼,使用var bullets =設置(),現在你可以使用b.remove –

回答

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

謝謝你這個作品的bot子彈走出框架,但如果他們都擊中對方,我得到同樣的錯誤。這裏是我的代碼...下吼 – 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 



      } 


     } 

     } 
相關問題