Ios 在didMove范围之外添加子项
据我所知,我在使用swift 3时遇到了一个非常不寻常的问题。我正在创建一个SpriteKit iOS游戏。问题在于Ios 在didMove范围之外添加子项,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,据我所知,我在使用swift 3时遇到了一个非常不寻常的问题。我正在创建一个SpriteKit iOS游戏。问题在于SKSpriteNode。我通过创建节点 var游戏背景:SKSpriteNode 它位于类的内部。然后在didMove()函数中初始化节点,如下所示 override func didMove(to view: SKView) { gameOverBackground = SKSpriteNode.init(texture: SKTexture(image
SKSpriteNode
。我通过创建节点
var游戏背景: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)
}
}
现在,当我稍后尝试将节点作为子节点添加到场景中时,问题出现了。我这样做是在一个接触函数中
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()
中添加子节点并将其隐藏即可。然后当接触发生时,让它不被隐藏;但我更好奇的是为什么会出现这个问题,以及我是否做错了什么
提前谢谢
我找到了一个解决方法,只需在didMove()中添加子节点并将其隐藏即可。然后当接触发生时,让它不被隐藏;但我更好奇的是为什么会出现这个问题,以及我是否做错了什么
这意味着您的节点在didMove中并非为零,但在您的联系人代理出现时,沿途的某个地方已变为零
以下是您的代码示例,只是稍微简化了一点:
var node: SKSpriteNode!
override func didMove(to view: SKView) {
node = SKSpriteNode(color: .blue, size: CGSize(width: 25, height: 25))
}
// Touchesbegan on ios:
override func mouseDown(with event: NSEvent) {
addChild(node)
}
代码运行正常,当您单击屏幕时,节点出现
touchesbeated/didbeagin不会有什么不同
问题是,在代码的某个地方,节点被设置为nil
下面是一个如何实现的示例:
// Touchesended on ios:
override func mouseUp(with event: NSEvent) {
node.removeFromParent() // or, node = nil
addChild(node) // crash!!
}
我认为您得到了错误,因为您将节点声明为var gameOverBackground:SKSpriteNode代码>此处隐式展开可选变量,当您在contact函数中使用此函数时,您的节点为nil,因此会抛出节点等于nil的错误,要消除此错误,您应该将变量声明为非可选变量,如var gameOverBackground=SKSpriteNode()
或类似于此,如果您希望它是可选的var gameOverBackground:SKSpriteNode?=SKSpriteNode()
或者干脆var gameOverBackground:SKSpriteNode?
但在这种情况下,它仍然是零,但不会crash@3stud1ant3您的建议可能有效,但您的推理是错误的:(!
只是告诉编译器“程序员在使用时将确保此值不是零”允许他们在其他地方对其进行初始化。问题是,尽管在中进行了初始化,但节点为nildidMove@Fluidity谢谢你的意见,我会记住的