当我尝试访问 Swift 中的粒子文件时,我的代码出现致命错误
My code has a fatal error when i'm trying to access a particle file in Swift
我正在召唤我在 .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 次以测试是否会出现致命错误,但并没有发生...
我正在尝试回答这部分问题:
the real question is WHY did'nt he found the file
我的回答假设问题每次都会发生,但只发生在某些版本上。
如果“.sks”文件在 "Copy Bundle Resources" 构建阶段为 0 字节,则可能是这个原因。
您可以检查模拟器中是否存在失败构建的文件。做 cd ~/Library/Developer/CoreSimulator/Devices
然后 find . -name MyParticle.sks
。然后对输出的文件名做ls -l
。 MyParticle.sks 是您期望的尺寸吗?到底有没有?
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()]))
}
我正在召唤我在 .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 次以测试是否会出现致命错误,但并没有发生...
我正在尝试回答这部分问题:
the real question is WHY did'nt he found the file
我的回答假设问题每次都会发生,但只发生在某些版本上。
如果“.sks”文件在 "Copy Bundle Resources" 构建阶段为 0 字节,则可能是这个原因。
您可以检查模拟器中是否存在失败构建的文件。做 cd ~/Library/Developer/CoreSimulator/Devices
然后 find . -name MyParticle.sks
。然后对输出的文件名做ls -l
。 MyParticle.sks 是您期望的尺寸吗?到底有没有?
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()]))
}