【问题标题】:Adding child outside of didMove scope在 didMove 范围之外添加子项
【发布时间】: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


【解决方案1】:

我找到了一种解决方法,只需在 didMove() 中添加子节点并将其隐藏即可。然后在发生接触时将其隐藏;但我更好奇为什么会出现这个问题以及我是否做错了什么。

这意味着您的节点在 didMove 中不是 nil,但是在您的联系委托时沿途某处已变为 nil。

这是您的代码示例,只是稍微简化了一点:

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!!
}

【讨论】:

    猜你喜欢
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多