我正在制作SpriteKit游戏,并且我有一个每秒执行几次的块。执行时,将创建小行星并将其添加到世界节点。播放几秒钟后,将它们添加到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
或类似内容中,以避免崩溃?请注意,每个小行星都有一个内部计时器,几秒钟后会将其从其父级中删除 最佳答案
正如其他评论:
try / catch不能解决问题,如果有错误,应该解决
您的代码(至少我们可以看到的代码)看起来正确
问题
如果导致错误的行是
self.worldNode.addChild(asteroid)
我可以猜测:
您将
worldNode
声明为隐式展开的可选var worldNode: SKNode!
您将
worldNode
设置为nil
的某处self.worldNode = nil
因此,稍后,当您的
SKAction
尝试在addChild
变量上调用nil
时,您会收到错误消息。我的解释与您项目中的其他代码匹配吗?如果可以,我可以建议2个解决方案
解决方案1
您应该停止将
worldNode
设置为nil
。解决方案2
或者,如果确实需要将
worldNode
设置为nil
,则应在此之前立即停止操作。首先为操作指定一个键(这样以后您就可以检索它了)
runAction(SKAction.repeatActionForever(makeAsteroid), withKey: "addAsteroidForever")
然后在设置
self.worldNode = nil
之前停止操作self.removeActionForKey("addAsteroidForever")
关于ios - 是否有可能有条件地 swift 向节点添加子节点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34090513/