在didMove范围之外添加子项

时间:2017-09-17 03:22:04

标签: ios swift sprite-kit

我遇到了一个非常不寻常的问题 - 据我所知 - 迅捷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()中添加子节点并将其隐藏起来,找到了解决方法。然后只是在接触发生时不加掩饰;但我更好奇为什么会出现这个问题,如果我做错了什么。

提前致谢!

1 个答案:

答案 0 :(得分: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不会有所作为。

问题是代码中的某个节点被设置为nil。

这是一个如何发生这种情况的例子:

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