【发布时间】:2017-09-17 13:26:04
【问题描述】:
我遇到了一个非常不寻常的问题——据我所知——swift 3。我正在创建一个 SpriteKit iOS 游戏。问题在于SKSpriteNode。我通过
var gameOverBackground : SKSpriteNode!
它位于类内部。然后我像这样在didMove()函数中初始化节点
override func didMove(to view: SKView) {
gameOverBackground = SKSpriteNode.init(texture: SKTexture(image: #imageLiteral(resourceName: "UIbg")), size: CGSize(width: (self.scene?.size.width)! / 1.5, height: (self.scene?.size.height)! / 1.5))
gameOverBackground.position = CGPoint(x: 0, y: 0)
gameOverBackground.zPosition = 10
gameOverBackground.name = "GameOverBackground"
}
现在,当我稍后尝试将该节点作为子节点添加到场景中时,问题就出现了。我在这样的联系功能中这样做
func didBegin(_ contact: SKPhysicsContact) {
if (contact with many nodes) {
self.addChild(self.gameOverBackground)
}
}
我不断收到节点等于nil 的错误。我找到了一种解决方法,只需在didMove() 中添加子节点并将其隐藏即可。然后在发生接触时将其隐藏;但我更好奇为什么会出现这个问题以及我是否做错了什么。
提前致谢!
【问题讨论】:
-
我认为你得到了错误,因为你将节点声明为
var gameOverBackground : SKSpriteNode!在这里你隐式地解开可选并且当你在联系函数中使用它时你的节点是 nil ,所以节点的错误等于 nil 被抛出,要摆脱这种情况,您应该将变量声明为非可选变量,如var gameOverBackground = SKSpriteNode()或如果您希望它是可选的var gameOverBackground : SKSpriteNode? = SKSpriteNode()或简单的var gameOverBackground : SKSpriteNode?,但在这种情况下它仍然是nil 但它不会崩溃 -
@3stud1ant3 您的建议可能有效,但您的推理是错误的 :(
!只是告诉编译器“程序员将确保在使用时该值不为零”以允许他们初始化它其他地方。问题是节点为 nil,尽管在 didMove 中初始化 -
@Fluidity 感谢您的意见,会记住这一点
标签: ios swift sprite-kit