我正在总结在.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次,以测试是否会出现致命错误,但那没有发生...
答案 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()]))
}