2017-09-17 42 views
1

我遇到了一个非常不寻常的问题 - 据我了解 - 迅速3.我创建一个SpriteKit iOS游戏。问题出在SKSpriteNode。我通过添加孩子以外的didMove范围

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()中添加子节点并隐藏它。然后在接触发生时不要隐瞒;但我更为好奇为什么这个问题正在发生,如果我做错了什么。

在此先感谢!

+0

:SKSpriteNode'这里你都隐含展开可选的,当你如果你使用这个接触函数你的节点是零,所以节点等于零的错误被抛出,为了摆脱这个,你应该声明变量为非可选像'var gameOverBackground = SKSpriteNode()'或者像这样希望它是可选的'var gameOverBackground:SKSpriteNode? ='SKSpriteNode()'或简单'var gameOverBackground:SKSpriteNode?'但在这种情况下,它仍然是零,但它不会崩溃 – 3stud1ant3

+2

@ 3stud1ant3你的建议可能工作,但你的推理是错误的('!'只是告诉编译器“程序员将确保这个值在使用时不为零”,以允许他们在其他地方初始化它。问题是该节点为零,尽管在didMove中初始化了 – Fluidity

+0

@Fluidity感谢您的输入,将会牢记在心 – 3stud1ant3

回答

1

我发现了一个解决方法,只需在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) 
} 

的代码运行正常,当你点击屏幕上出现的节点。

Touchesbegan/didBegin不会有所作为。

问题是在你的代码中的某个地方节点被设置为零。

这里是怎么会发生的一个例子:我想是因为你在声明节点为'无功gameOverBackground您收到错误

// Touchesended on ios: 
override func mouseUp(with event: NSEvent) { 
    node.removeFromParent() // or, node = nil 
    addChild(node) // crash!! 
}