我正在制作一个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
或类似内容中,以避免崩溃? 请注意,每个小行星都有一个内部计时器,几秒钟后会将其从父程序中移除
答案 0 :(得分:1)
正如其他人评论的那样:
如果导致错误的行是
self.worldNode.addChild(asteroid)
我可以猜到:
您将worldNode
声明为隐式解包可选
var worldNode: SKNode!
您正在将worldNode
设置为nil
self.worldNode = nil
因此,稍后,当SKAction
尝试在addChild
变量上调用nil
时,您会收到错误。
我的解释是否与您项目中的其他代码相符?如果确实如此,我可以建议2个解决方案
您应该停止将worldNode
设置为nil
。
或者,如果您确实需要将worldNode
设置为nil
,则应立即停止操作。
首先给动作一个键(这样你以后就可以检索它)
runAction(SKAction.repeatActionForever(makeAsteroid), withKey: "addAsteroidForever")
然后在设置self.worldNode = nil
之前停止操作
self.removeActionForKey("addAsteroidForever")