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

Ios 致命错误索引超出范围swift 3 SpriteKit,ios,arrays,swift,sprite-kit,fatal-error,Ios,Arrays,Swift,Sprite Kit,Fatal Error,我想做一个双人射击游戏。我正试图摧毁你已经用过的子弹。在更新中,我使用的是代码 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 b

我想做一个双人射击游戏。我正试图摧毁你已经用过的子弹。在更新中,我使用的是代码

 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")



        }
var bulletsChecked=0
子弹中的b{
如果b.pos.y>self.frame.height | | b.pos.y<-self.frame.height{
项目符号。移除(位于:项目符号选中)
打印(“销毁旧子弹”)
}

在更新结束时,我还有bulletsChecked+=1。除非玩家一和玩家二同时射击,否则此代码可以正常工作。然后我在“子弹。移除(在:bulletsChecked)”上得到“致命错误索引超出范围”错误。有什么想法吗?

您可以通过按相反顺序遍历数组来避免索引问题

for b in bullets.reversed() {
...
}
[编辑]您还可以使用筛选器从阵列中删除项目符号

例如:

bullets = bullets.filter 
{
   bullet in 
   return bullet.pos.y >  self.frame.height 
       || bullet.pos.y < -self.frame.height
} 
bullets=bullets.filter
{
弹射
返回项目符号位置y>自身框架高度
||项目符号y位置<自身框架高度
} 

请注意,我不清楚删除项目符号的测试如何产生所需的结果,但我假设它做了您希望它做的事情,并且它不会尝试删除不应该删除的项目符号。

/==BULLETT和PLAYER 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



            }


        }

        }
if canHitP2{

如果删除项目符号时b.pos.y>=self.frame.height-P2.size.height&&(b.pos.x>=P2.position.x-P2.size.width/2&&b.pos.x),则会丢弃剩余项目符号的索引。有两种修复方法:1)只有在未删除项目符号时才会选中增量项目符号。或2)向后遍历(索引,b)的数组
在项目符号.enumerated().reversed(){如果项目符号符合条件{项目符号.remove(at:index)}}
如果要删除屏幕外的项目符号,可以采用两种更好的方法:1)添加屏幕的物理循环并删除与之接触的项目符号。2)在射击项目符号时(我认为是applyImpulse)添加一个SKAction序列,在一段时间延迟后删除项目符号。如果您想保留代码,请使用var bullets=Set(),现在您可以使用b.removeThank。这适用于超出帧的机器人项目符号,但如果它们都击中对方,我会得到相同的错误。这是我的代码…下面的代码