当我尝试在Swift中访问粒子文件时,我的代码出现致命错误

时间:2019-08-25 21:15:08

标签: swift sprite-kit runtime-error particles

我正在总结在.sks文件中创建的粒子。在大多数情况下,粒子可以很好地被召唤,但有时(例如400个粒子中的一个)我会出现致命错误。

这是用于召唤粒子的代码:

    func createParticle(touchLocation : CGPoint) {
      let particles = SKEmitterNode(fileNamed: "MyParticle.sks")!
      let touch = CGPoint(x: touchLocation.x, y: self.view!.frame.height - touchLocation.y)
      particles.position = touch
      particles.zPosition = 1
      addChild(particles)
      particles.run(SKAction.sequence([SKAction.wait(forDuration: 3.0), SKAction.removeFromParent()]))

}

当发生致命错误时,在此行:

    let particles = SKEmitterNode(fileNamed: "MyParticle.sks")!

它显示“致命错误:在展开可选值时意外发现nil”。可能是因为他没有找到文件,但是真正的问题是为什么,而他在大多数时候都没有找到文件...注意:此脚本是在检测到文件后执行的触摸。

我尝试过:

func createParticle(touchLocation : CGPoint) {
    for _ in 0...100 {
        let particles = SKEmitterNode(fileNamed: "MyParticle.sks")!
        let touch = CGPoint(x: touchLocation.x, y: self.view!.frame.height - touchLocation.y)
        particles.position = touch
        particles.zPosition = 1
        addChild(particles)
        particles.run(SKAction.sequence([SKAction.wait(forDuration: 3.0), SKAction.removeFromParent()]))
    }
}

然后我将整个脚本执行大约100次,以测试是否会出现致命错误,但那没有发生...

2 个答案:

答案 0 :(得分:0)

我正在尝试回答问题的这一部分:

  

真正的问题是为什么他没有找到文件

我的回答假设问题每次都发生,但仅在某些特定版本上发生。

如果在“复制捆绑资源”构建阶段中“ .sks”文件为0字节,则可能是原因。

您可以检查模拟器中是否存在用于失败构建的文件。执行cd ~/Library/Developer/CoreSimulator/Devices,然后执行find . -name MyParticle.sks。然后对输出的文件名执行ls -l。 MyParticle.sks是您期望的大小吗?那里有吗?

答案 1 :(得分:0)

FileIO访问总是很慢。当循环非常快时,您将遇到以下情况:您可能正在读取尚未关闭的文件,因此返回nil。

相反,只需调用一次方法,然后将其存储在变量中即可。

然后您可以复制您的节点,使您可以复制所需的100个副本。

var particleNode = SKEmitterNode(fileNamed: "MyParticle")!  

func createParticle(touchLocation : CGPoint) {
    let particles = particleNode.copy() as! SKEmitterNode
    let touch = CGPoint(x: touchLocation.x, y: self.view!.frame.height - touchLocation.y)
    particles.position = touch
    particles.zPosition = 1
    addChild(particles)
    particles.run(SKAction.sequence([SKAction.wait(forDuration: 3.0), SKAction.removeFromParent()]))
}