致命错误索引超出范围swift 3 SpriteKit

问题描述:

我正在尝试制作双人射击游戏。我试图摧毁你已经使用过的子弹。在更新我使用的代码致命错误索引超出范围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 –

您可以通过逆序排列数组来避免索引问题。

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

// ======之间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 



      } 


     } 

     }