我正在制作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/

10-09 01:20