【问题标题】:My code has a fatal error when i'm trying to access a particle file in Swift当我尝试在 Swift 中访问粒子文件时,我的代码出现致命错误
【发布时间】:2019-08-25 21:15:08
【问题描述】:

我正在召唤我在 .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”。可能是因为他没有找到该文件,但真正的问题是 WHY 他没有找到该文件,而大部分时间他都找到了它...注意:此脚本在检测到触摸。

我试过这个:

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 次以测试是否会出现致命错误,但它没有发生......

【问题讨论】:

  • 您犯了两个基本错误。 (1) 在 for 循环中访问完全相同的文件 100 次。 (2) 强制展开可选值。
  • 哦,是的,我为什么没有想到...然后解决方案是执行以下操作:guard letparticles = SKEmitterNode(fileNamed: "MyParticle.sks") { else return }那么当出现错误并且程序找不到文件时,它就不会创建任何粒子......谢谢!
  • 不要使用扩展

标签: swift sprite-kit runtime-error particles


【解决方案1】:

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()]))
}

【讨论】:

  • 我不需要 100 个粒子,循环只是为了测试,但谢谢你,我认为你的解决方案将适用于我想做的事情 ;)
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 对不起,我不明白你回答的第一部分。而且我不能在检测到触摸后等待 4 秒,因为它需要立即执行。当您点击屏幕时,程序会测试它是否匹配按钮位置,如果匹配,则增加分数并生成一个粒子。如果用户再次点击它重做它。并且构建阶段是在开始,这个脚本在开始时永远不会崩溃
  • @Titouan 我误解了您所说的“触摸”是什么意思。让我更新答案。
猜你喜欢
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 2012-11-01
  • 2019-04-21
  • 2021-05-21
  • 2011-07-12
  • 2011-06-02
  • 2020-03-19
相关资源
最近更新 更多