所以我想将SKSpritenode添加到我的场景level2,我想给它一个物理材质,其纹理来自于我上传到项目的Assets文件夹中的图像。图像在那里,名称正确,但是启动应用程序时出现致命错误。在我添加了最后一行代码之前,我无法弄清哪里出错了,因为该应用程序曾经可以平稳运行。
import UIKit
import SpriteKit
import GameplayKit
class level2: SKScene {
var entities = [GKEntity]()
var graphs = [String : GKGraph]()
var perno = SKSpriteNode(fileNamed: "perno")
override func sceneDidLoad () {
print ("view2 Loaded")
self.perno = self.childNode(withName: "perno") as? SKSpriteNode
self.perno?.texture = SKTexture(imageNamed: "perno")
self.perno?.size.width = self.perno!.size.width * 5
self.perno!.physicsBody = SKPhysicsBody(texture: (perno?.texture)!, size: (perno?.texture?.size())!)
}
有什么提示吗?
谢谢!
答案 0 :(得分:3)
您的可选处理确实不一致。有时,您使用可选的强制转换和可选的链接只是为了对同一行中的同一变量使用强制展开。您应该强制解开SKSpriteNode(fileNamed: "perno")
的返回值,因为如果返回值返回nil
,则表示这是程序员错误,应尽快捕获。
您的直接问题似乎是您尝试覆盖perno
中的sceneDidLoad
:
self.perno = self.childNode(withName: "perno") as? SKSpriteNode
场景中没有添加childNode
,因此您只需将perno
设置为nil
即可,而不是使用var perno = SKSpriteNode(fileNamed: "perno")
为其先前设置的值。只需从sceneDidLoad
中删除该行,因为没有意义,perno
在初始化期间已经加载,因为您为其分配了一个值。
class Level2: SKScene {
var entities = [GKEntity]()
var graphs = [String : GKGraph]()
let perno = SKSpriteNode(fileNamed: "perno")!
override func sceneDidLoad () {
print ("view2 Loaded")
self.perno.texture = SKTexture(imageNamed: "perno")
self.perno.size.width = self.perno.size.width * 5
self.perno.physicsBody = SKPhysicsBody(texture: perno.texture!, size: perno.texture!.size())
}
}
保护自己的更好方法是使用guard
语句。 guard
允许您安全地检查变量是否为nil,而不必嵌套代码。
class Level2: SKScene {
var entities = [GKEntity]()
var graphs = [String : GKGraph]()
let perno = SKSpriteNode(fileNamed: "perno")!
override func sceneDidLoad () {
print ("view2 Loaded")
guard let texture = SKTexture(imageNamed: "perno")
else{
fatalError("Unable to find texture "perno")
}
self.perno.texture = texture
self.perno.size.width = self.perno.size.width * 5
self.perno.physicsBody = SKPhysicsBody(texture: texture, size: texture.size())
}
}
如您所见,我们并没有过度解开self.perno.texture
,这意味着我们偶然使用?的机会会更少。而不是!,我们在代码崩溃的原因上有明确的错误。