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

 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和玩家2同时射击,否则此代码可以正常工作。然后我得到“子弹。删除(at:bulletsChecked)”上的“致命错误索引超出范围”错误有什么想法吗?

最佳答案

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

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

[编辑]您还可以使用筛选器从阵列中删除项目符号。
例如:
bullets = bullets.filter
{
   bullet in
   return bullet.pos.y >  self.frame.height
       || bullet.pos.y < -self.frame.height
} 

请注意,我不清楚您的项目符号删除测试如何生成所需的结果,但我假设它执行了您希望它执行的操作,并且它不会尝试删除不应删除的项目符号。

10-06 03:22