【问题标题】:Fatal Error index out of range swift 3 SpriteKit致命错误索引超出范围迅速3 SpriteKit
【发布时间】:2017-10-31 16:09:03
【问题描述】:

我正在尝试制作一个两人射击游戏。我正在尝试摧毁你已经使用过的子弹。在更新中我使用的是代码

 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)”上得到“Fatal Error index out of range”错误有什么想法吗?

【问题讨论】:

  • 删除一个项目符号时,会丢弃剩余项目符号的索引。两种修复方法 1) 只有在您没有删除项目符号时才增加 bulletsChecked。或 2) 向后遍历您的数组 for (index,b) in bullets.enumerated().reversed() { if bullet meets criteria { bullets.remove(at: index) }}
  • 如果您想移除屏幕外的子弹,您可以通过两种更好的方式进行:1)添加屏幕的物理循环并移除与其接触的子弹。 2)当你射击子弹时(我认为是applyImpulse)添加一系列SKAction,在一段时间延迟后移除子弹。如果您想维护您的代码,请使用 var bullets = Set() 现在您可以使用 b.remove

标签: ios arrays swift sprite-kit fatal-error


【解决方案1】:

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

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

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

例如:

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

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

【讨论】:

  • 谢谢你,这适用于机器人子弹超出框架但如果它们都互相击中我会得到同样的错误。这是我的代码...在下面
【解决方案2】:

//====== 子弹和玩家 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



            }


        }

        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多