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

时间:2017-05-31 02:52:51

标签: 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 bullets")



        }

我在更新结束时也有bulletsChecked + = 1。此代码工作正常,除非播放器1和播放器两个同时拍摄。然后我得到&#34;致命错误指数超出范围&#34;错误的&#34; bullets.remove(at:bulletsChecked)&#34;有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

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

[编辑]您还可以使用过滤器从阵列中删除项目符号。

例如:

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

请注意,我不清楚你的子弹删除测试如何产生所需的结果,但我认为它做你想做的事情并且不会尝试删除不应删除的项目符号

答案 1 :(得分:0)

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



            }


        }

        }