是否可以有条件地以快速方式将节点添加到节点

时间:2015-12-04 14:25:13

标签: ios swift sprite-kit try-catch

我正在制作一个SpriteKit游戏,我有一个每秒执行几次的块。执行时,会创建小行星并将其添加到world节点。播放几秒钟后,将它们添加到worldNode(EXC_BAD_ACCESS)时会发生错误。代码如下所示

 let wait = SKAction.waitForDuration(0.2)
 let spawnAsteroid = SKAction.runBlock() {
    let asteroid = Asteroid(player: self.player, screenSize: self.size)
    self.worldNode.addChild(asteroid)
 }
 let makeAsteroid = SKAction.sequence([wait, spawnAsteroid])
 runAction(SKAction.repeatActionForever(makeAsteroid))

我想知道是否可以将self.worldNode.addChild(asteroid)行包裹在try/catch或类似内容中,以避免崩溃? 请注意,每个小行星都有一个内部计时器,几秒钟后会将其从父程序中移除

1 个答案:

答案 0 :(得分:1)

正如其他人评论的那样:

  1. try / catch不是答案,如果有错误则应该修复
  2. 您的代码(至少我们能看到的代码)看起来正确
  3. 问题

    如果导致错误的行是

    self.worldNode.addChild(asteroid)
    

    我可以猜到:

    1. 您将worldNode声明为隐式解包可选

      var worldNode: SKNode!
      
    2. 您正在将worldNode设置为nil

      self.worldNode = nil
      
    3. 因此,稍后,当SKAction尝试在addChild变量上调用nil时,您会收到错误。

      我的解释是否与您项目中的其他代码相符?如果确实如此,我可以建议2个解决方案

      解决方案1 ​​

      您应该停止将worldNode设置为nil

      解决方案2

      或者,如果您确实需要将worldNode设置为nil,则应立即停止操作。

      首先给动作一个键(这样你以后就可以检索它)

      runAction(SKAction.repeatActionForever(makeAsteroid), withKey: "addAsteroidForever")
      

      然后在设置self.worldNode = nil之前停止操作

      self.removeActionForKey("addAsteroidForever")